home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Software of the Month Club / Amiga General Interest Volume 220 (1995)(SOMC)(Disk 2 of y)[SMCxxxC30Ix].zip / Amiga General Interest Volume 220 (1995)(SOMC)(Disk 2 of y)[SMCxxxC30Ix].adf / Typeface / Source / typeface.c < prev    next >
C/C++ Source or Header  |  1995-10-05  |  79KB  |  2,952 lines

  1. /***********************/
  2. /*               */
  3. /* Typeface v1.1       */
  4. /* © 1995 David Kinder */
  5. /*               */
  6. /***********************/
  7.  
  8. #include "Typeface.h"
  9.  
  10. extern struct IntuitionBase *IntuitionBase;
  11. extern struct GfxBase *GfxBase;
  12. struct Library *AslBase, *BGUIBase, *DiskfontBase, *TextFieldBase;
  13. struct Library *IFFParseBase;
  14. struct Screen *Screen;
  15. struct Window *FontWnd, *OldWindowPtr;
  16. struct DrawInfo *ScrDrawInfo;
  17. struct List *CharWndList;
  18. struct MsgPort *WndMsgPort;
  19. struct Image *SizeImage, *LeftImage, *RightImage, *UpImage, *DownImage;
  20. struct TextFont *NewFont, *ScrFont, *FixFont;
  21. struct FontRequester *FontReq, *PrefsFontReq;
  22. struct ScreenModeRequester *PrefsScrReq;
  23. struct Hook *FontWndHook;
  24. struct Character CharBuffer[257];
  25. struct Character ClipChar;
  26. struct IBox CharSize, FontSize;
  27. struct NameInfo ModeIDName;
  28. Object *FontWndObj, *CharObj, *ScrollObj;
  29. Class *CharClass, *EditClass, *SlideClass;
  30. WORD SpaceTable[257], KernTable[257];
  31. ULONG FirstChar, LastChar, ScaleX, ScaleY, UseTable, ScrWidth, ScrHeight;
  32. char WinTitle[256], FontPath[256], SavePath[256], FontName[256];
  33. BOOL CustomScreen = TRUE, ChangeScreen = FALSE, FlagError;
  34. BOOL NewCustom, NewWindow, MaxWindow = FALSE, ConfirmQuit = FALSE;
  35. BOOL ShowBLine = FALSE, DataChanged, AutoHeight = FALSE, InvertShift = FALSE;
  36.  
  37. struct Preferences Prefs;
  38. struct TextAttr ScrFontAttr, FixFontAttr;
  39. char ScrFontAttrName[MAXFONTNAME], FixFontAttrName[MAXFONTNAME];
  40. struct NewMenu Menus[] = { PROJECT_MENU,FONT_MENU,End };
  41. struct NewMenu CharMenus[] = { PROJECT_MENU,FONT_MENU,CHARACTER_MENU,End };
  42. struct IBox Box = { 0,0,0,0 };
  43. char Version[] = "$VER: "NAME" "VERSION" (5.10.95)";
  44.  
  45. struct Window *ParamWnd;
  46. Object *ParamWndObj, *PropCycle, *HeightInt, *WidthInt, *BaseInt, *SmearInt;
  47. Object *NormalCheck, *BoldCheck, *ItalicCheck, *UnderCheck;
  48. Object *ExtCheck, *RevCheck, *AspectCycle, *BlankButton;
  49. ULONG Proportional, Normal, Bold, Italic, ULine, Extended, Reversed;
  50. ULONG Height, Width, Baseline, Smear, Aspect;
  51. STRPTR PropLabels[3], AspectLabels[4], SaveLabels[3];
  52.  
  53. struct Window *PrefsWnd;
  54. Object *PrefsWndObj;
  55. Object *CustButton, *ModeButton, *ModeInfo, *FontButton, *FontInfo, *PubStr;
  56. Object *VecInt, *PixelXInt, *PixelYInt, *PixelCycle, *SizeCheck, *ChrHInt;
  57. Object *SaveCycle, *ChrWCycle, *ChrFontInfo, *ChrFontButton, *MaxCheck;
  58. Object *QuitCheck, *BLineCheck, *AutoCheck, *ShiftCheck;
  59. char PrefScrBuffer[256];
  60. ULONG PrefScrModeID,PrefScrDepth;
  61. char PrefScrFontName[MAXFONTNAME];
  62. UWORD PrefScrFontHeight;
  63. char PrefThisPubName[MAXPUBSCREENNAME], PrefDefPubName[MAXPUBSCREENNAME];
  64. extern ULONG PixelBorder;
  65. Object *TBarObj[MAX_TBAR];
  66. char PrefFixFontName[MAXFONTNAME];
  67. UWORD PrefFixFontHeight;
  68. char PrefFixBuffer[256];
  69. STRPTR PrefsPages[6], BorderLabels[4];
  70.  
  71. struct Window *AssignWnd;
  72. Object *AssignWndObj, *FontDirStr, *DirReqObj, *SaveReqObj;
  73.  
  74. struct Window *WidthWnd;
  75. struct Character *WidthChar;
  76. struct CharNode *WidthNode;
  77. Object *WidthWndObj, *ChrWidthScroll, *ChrWidthInt, *LeftInd, *RightInd;
  78. char WidthTitle[256];
  79.  
  80. struct Window *KernWnd;
  81. struct Character *KernChar;
  82. struct CharNode *KernNode;
  83. Object *KernWndObj, *SpaceObj, *KernObj;
  84. char KernTitle[256];
  85.  
  86. struct Window *SaveWnd;
  87. Object *SaveWndObj, *SaveDirStr, *FontNameStr, *SizeInfo;
  88. Object *FirstNum, *LastNum, *TableCheck;
  89.  
  90. extern struct Window *PreviewWnd;
  91. extern Object *PreviewWndObj;
  92.  
  93. main()
  94. {
  95.   Setup();
  96.   MsgLoop();
  97. }
  98.  
  99. wbmain()
  100. {
  101.   main();
  102. }
  103.  
  104. void Setup(void)
  105. {
  106. struct Screen *defscr;
  107. static struct TextAttr topaz8 = { "topaz.font",8,FS_NORMAL,FPF_ROMFONT };
  108. BPTR lock;
  109.  
  110.   if (IntuitionBase->LibNode.lib_Version < 37) Quit();
  111.   if ((AslBase = OpenLibrary("asl.library",37)) == NULL)
  112.     Error(GetString(msgNoAslLib));
  113.   if ((DiskfontBase = OpenLibrary("diskfont.library",36)) == NULL)
  114.     Error(GetString(msgNoDiskfontLib));
  115.   if ((IFFParseBase = OpenLibrary("iffparse.library",37)) == NULL)
  116.     Error(GetString(msgNoIFFParseLib));
  117.   if ((BGUIBase = OpenLibrary("bgui.library",39)) == NULL)
  118.   {
  119.     if ((BGUIBase = OpenLibrary("PROGDIR:libs/bgui.library",39)) == NULL)
  120.       Error(GetString(msgNoBguiLib));
  121.   }
  122.   if ((TextFieldBase = OpenLibrary("gadgets/textfield.gadget",3)) == NULL)
  123.   {
  124.     if ((TextFieldBase = OpenLibrary("PROGDIR:gadgets/textfield.gadget",3))
  125.       == NULL) Error(GetString(msgNoTextFieldGadget));
  126.   }
  127.   if ((FontReq = AllocAslRequestTags(ASL_FontRequest,
  128.     ASLFO_TitleText,GetString(msgOpenFont),
  129.     ASLFO_MaxHeight,1000,TAG_DONE)) == NULL) ErrorCode(ASLALLOC);
  130.   if ((PrefsFontReq = AllocAslRequestTags(ASL_FontRequest,
  131.     ASLFO_TitleText,GetString(msgScreenFont),
  132.     ASLFO_MaxHeight,1000,TAG_DONE)) == NULL) ErrorCode(ASLALLOC);
  133.   if (AslBase->lib_Version > 37)
  134.   {
  135.     if ((PrefsScrReq = AllocAslRequestTags(ASL_ScreenModeRequest,
  136.       ASLSM_TitleText,GetString(msgScreenMode),
  137.       ASLSM_DoDepth,TRUE,TAG_DONE)) == NULL) ErrorCode(ASLALLOC);
  138.   }
  139.   if ((CharClass = InitCharGadgClass()) == NULL) Quit();
  140.   if ((EditClass = InitEditGadgClass()) == NULL) Quit();
  141.   if ((SlideClass = InitSlideGadgClass()) == NULL) Quit();
  142.   if (GetNewList(&CharWndList) == NULL) Quit();
  143.   if ((WndMsgPort = CreateMsgPort()) == NULL) ErrorCode(CREATEPORT);
  144.  
  145.   strcpy(Prefs.ThisPubName,NAME);
  146.   GetDefaultPubScreen(Prefs.DefPubName);
  147.   if ((defscr = LockPubScreen(Prefs.DefPubName)) == NULL)
  148.     ErrorCode(LOCKSCREEN);
  149.   Prefs.Version = CURRENT_PREFS;
  150.   Prefs.Flags = PREFS_CUSTOMSCREEN|PREFS_PIXELBORDER;
  151.   Prefs.ScrModeID = GetVPModeID(&defscr->ViewPort);
  152.   Prefs.ScrDepth = 2;
  153.   Prefs.VecHeight = 11;
  154.   Prefs.PixelX = 20;
  155.   Prefs.PixelY = 20;
  156.   strcpy(Prefs.ScrFontName,defscr->Font->ta_Name);
  157.   Prefs.ScrFontHeight = defscr->Font->ta_YSize;
  158.   strcpy(Prefs.FixedFontName,
  159.     GfxBase->DefaultFont->tf_Message.mn_Node.ln_Name);
  160.   Prefs.FixedFontHeight = GfxBase->DefaultFont->tf_YSize;
  161.   Prefs.ToolBar = DEFAULT_TBAR;
  162.   Prefs.CharSize = FALSE;
  163.   Prefs.CharWidth = 1;
  164.   Prefs.CharHeight = 8;
  165.   UnlockPubScreen(NULL,defscr);
  166.  
  167.   if ((FontWndHook = AllocVec(sizeof(struct Hook),MEMF_CLEAR)) == NULL)
  168.     ErrorCode(ALLOCVEC);
  169.   FontWndHook->h_Entry = WindowHook;
  170.  
  171.   LoadPrefs();
  172.   SetupScreen();
  173.   strcpy(FontPath,"FONTS:");
  174.   if (lock = Lock("FONTS:",ACCESS_READ))
  175.   {
  176.     NameFromLock(lock,FontPath,256);
  177.     UnLock(lock);
  178.   }
  179.   strcpy(SavePath,FontPath);
  180.   LoadFont(&topaz8);
  181. }
  182.  
  183. void SetupScreen(void)
  184. {
  185. UWORD pens[] = { ~0 };
  186. struct Screen *pubscr;
  187. BOOL unique_pub_name = TRUE;
  188.  
  189.   if (CustomScreen)
  190.   {
  191.     strcpy(ScrFontAttrName,Prefs.ScrFontName);
  192.     ScrFontAttr.ta_Name = ScrFontAttrName;
  193.     ScrFontAttr.ta_YSize = Prefs.ScrFontHeight;
  194.     ScrFontAttr.ta_Style = FS_NORMAL;
  195.     ScrFont = OpenDiskFont(&ScrFontAttr);
  196.  
  197.     if ((pubscr = LockPubScreen(Prefs.ThisPubName)) != NULL)
  198.     {
  199.       UnlockPubScreen(NULL,pubscr);
  200.       unique_pub_name = FALSE;
  201.     }
  202.  
  203.     if ((Screen = OpenScreenTags(NULL,
  204.       SA_Depth,Prefs.ScrDepth,
  205.       SA_DisplayID,Prefs.ScrModeID,
  206.       unique_pub_name ? SA_PubName : TAG_IGNORE,Prefs.ThisPubName,
  207.       SA_Pens,pens,
  208.       SA_Font,&ScrFontAttr,
  209.       SA_Title,NAME,
  210.       SA_AutoScroll,TRUE,
  211.       TAG_DONE)) == NULL) ErrorCode(OPENSCREEN);
  212.     PubScreenStatus(Screen,0);
  213.   }
  214.   else
  215.   {
  216.     if ((Screen = LockPubScreen(Prefs.DefPubName)) == NULL)
  217.     {
  218.       if ((Screen = LockPubScreen(NULL)) == NULL)
  219.     ErrorCode(LOCKSCREEN);
  220.     }
  221.   }
  222.   GetScreenRatio(Screen);
  223.  
  224.   if ((ScrDrawInfo = GetScreenDrawInfo(Screen)) == NULL) Quit();
  225.   SizeImage = CreateSysImage(SIZEIMAGE,ScrDrawInfo);
  226.   LeftImage = CreateSysImage(LEFTIMAGE,ScrDrawInfo);
  227.   RightImage = CreateSysImage(RIGHTIMAGE,ScrDrawInfo);
  228.   UpImage = CreateSysImage(UPIMAGE,ScrDrawInfo);
  229.   DownImage = CreateSysImage(DOWNIMAGE,ScrDrawInfo);
  230.   Box.Top = Screen->BarHeight+1;
  231.   if (AutoHeight) Prefs.VecHeight = SizeY(11);
  232.   OpenFontWnd();
  233.   ScreenToFront(Screen);
  234. }
  235.  
  236. __geta4 void WindowHook(__a0 struct Hook *hook, __a2 Object *o,
  237.   __a1 struct IntuiMessage *msg)
  238. {
  239. Object *charobj;
  240. ULONG height,pos;
  241. struct IBox newp;
  242.  
  243.   if ((msg->Class == IDCMP_CHANGEWINDOW) && (msg->Code == CWCODE_MOVESIZE))
  244.   {
  245.     GetAttr(EXT_Object,CharObj,&charobj);
  246.     GetAttr(WINDOW_Bounds,FontWndObj,&newp);
  247.     if ((newp.Width != FontSize.Width) || (newp.Height != FontSize.Height))
  248.     {
  249.       height = (FontWnd->Height-FontWnd->BorderTop-FontWnd->BorderBottom-
  250.     (2*SizeY(2)))/GetCharGadgHeight(1,FixFont);
  251.       GetAttr(CG_Pos,charobj,&pos);
  252.       SetGadgetAttrs(ScrollObj,FontWnd,NULL,
  253.     PGA_Top,pos,
  254.     PGA_Total,256/(4<<Prefs.CharWidth),
  255.     PGA_Visible,height,TAG_DONE);
  256.       GetAttr(PGA_Top,ScrollObj,&pos);
  257.       SetGadgetAttrs(charobj,FontWnd,NULL,
  258.     CG_Pos,pos,
  259.     CG_SizeY,height,
  260.     CG_Redraw,TRUE,TAG_DONE);
  261.     }
  262.     GetAttr(WINDOW_Bounds,FontWndObj,&FontSize);
  263.   }
  264. }
  265.  
  266. void OpenFontWnd(void)
  267. {
  268. ULONG height;
  269.  
  270.   strcpy(FixFontAttrName,Prefs.FixedFontName);
  271.   FixFontAttr.ta_Name = FixFontAttrName;
  272.   FixFontAttr.ta_YSize = Prefs.FixedFontHeight;
  273.   FixFontAttr.ta_Style = FS_NORMAL;
  274.   FixFont = OpenDiskFont(&FixFontAttr);
  275.  
  276.   height = Prefs.CharHeight+1;
  277.   do
  278.   {
  279.     height--;
  280.     Box.Height = GetCharGadgHeight(height,FixFont)+(2*SizeY(2))+
  281.       Screen->WBorTop+1+Screen->Font->ta_YSize+
  282.       (Prefs.CharSize ? SizeImage->Height : Screen->WBorBottom);
  283.   } while (Box.Height > Screen->Height);
  284.  
  285.   SetupMenus(Menus);
  286.   FontWndObj = WindowObject,
  287.     WINDOW_Screen,Screen,
  288.     WINDOW_SharedPort,WndMsgPort,
  289.     WINDOW_IDCMPHook,FontWndHook,
  290.     WINDOW_IDCMPHookBits,IDCMP_CHANGEWINDOW,
  291.     WINDOW_MenuStrip,Menus,
  292.     WINDOW_Bounds,&Box,
  293.     WINDOW_HelpFile,NAME".guide",
  294.     WINDOW_SmartRefresh,TRUE,
  295.     WINDOW_NoBufferRP,TRUE,
  296.     WINDOW_SizeGadget,Prefs.CharSize,
  297.     WINDOW_Title,WinTitle,
  298.     WINDOW_MasterGroup,
  299.       HGroupObject,
  300.     HOffset(SizeX(4)),VOffset(SizeY(2)),Spacing(SizeX(2)),
  301.     StartMember,
  302.       CharObj = ExternalObject,
  303.         EXT_MinWidth,GetCharGadgWidth(4<<Prefs.CharWidth,FixFont)-2,
  304.         EXT_MinHeight,GetCharGadgHeight(2,FixFont)-2,
  305.         EXT_Class,CharClass,
  306.         EXT_NoRebuild,TRUE,
  307.         CG_Font,FixFont ? FixFont : GfxBase->DefaultFont,
  308.         CG_SizeX,4<<Prefs.CharWidth,
  309.         CG_SizeY,height,
  310.         GA_ID,ID_CHARS,
  311.       EndObject,
  312.     EndMember,
  313.     StartMember,
  314.       ScrollObj = PropObject,
  315.         PGA_Top,0,
  316.         PGA_Total,256/(4<<Prefs.CharWidth),
  317.         PGA_Visible,height,
  318.         PGA_Arrows,TRUE,
  319.         GA_ID,ID_CHARSCROLL,
  320.       EndObject,
  321.       FixMinWidth,
  322.     EndMember,
  323.       EndObject,
  324.     EndObject;
  325.   if (FontWndObj == NULL) ErrorCode(NEWWINDOW);
  326.   if ((FontWnd = WindowOpen(FontWndObj)) == NULL)
  327.   {
  328.     if (Prefs.CharWidth > 0)
  329.     {
  330.       CloseFontWnd();
  331.       Prefs.CharWidth--;
  332.       OpenFontWnd();
  333.     }
  334.     else ErrorCode(OPENWINDOW);
  335.   }
  336.   FontWnd->MaxWidth = FontWnd->Width;
  337.   FontWnd->MaxHeight = GetCharGadgHeight(256/(4<<Prefs.CharWidth),FixFont)+
  338.     FontWnd->BorderTop+FontWnd->BorderBottom+(2*SizeY(2));
  339.   OldWindowPtr = ((struct Process *)FindTask(NULL))->pr_WindowPtr;
  340.   ((struct Process *)FindTask(NULL))->pr_WindowPtr = FontWnd;
  341.   GetAttr(WINDOW_Bounds,FontWndObj,&CharSize);
  342.   CharSize.Left += (CharSize.Width + Screen->RastPort.Font->tf_YSize);
  343.   CharSize.Width = Screen->Width - CharSize.Left;
  344.   CharSize.Height = Screen->Height - CharSize.Top;
  345.   GetAttr(WINDOW_Bounds,FontWndObj,&FontSize);
  346. }
  347.  
  348. void CloseFontWnd(void)
  349. {
  350.   ClrWindowClose(&FontWndObj,&FontWnd);
  351.   ClrDisposeObject(&FontWndObj);
  352.   if (FixFont)
  353.   {
  354.     CloseFont(FixFont);
  355.     FixFont = NULL;
  356.   }
  357. }
  358.  
  359. void Quit(void)
  360. {
  361.   QuitScreen();
  362.   RemoveList(&CharWndList,TRUE,NULL);
  363.   ClearCurrentFont();
  364.   if (ClipChar.chr_Data) FreeVec(ClipChar.chr_Data);
  365.   if (NewFont) CloseFont(NewFont);
  366.   if (WndMsgPort) DeleteMsgPort(WndMsgPort);
  367.   if (SlideClass) FreeEditGadgClass(SlideClass);
  368.   if (EditClass) FreeEditGadgClass(EditClass);
  369.   if (CharClass) FreeCharGadgClass(CharClass);
  370.   if (PrefsScrReq) FreeAslRequest(PrefsScrReq);
  371.   if (PrefsFontReq) FreeAslRequest(PrefsFontReq);
  372.   if (FontReq) FreeAslRequest(FontReq);
  373.   if (FontWndHook) FreeVec(FontWndHook);
  374.   if (BGUIBase) CloseLibrary(BGUIBase);
  375.   if (TextFieldBase) CloseLibrary(TextFieldBase);
  376.   if (IFFParseBase) CloseLibrary(IFFParseBase);
  377.   if (DiskfontBase) CloseLibrary(DiskfontBase);
  378.   if (AslBase) CloseLibrary(AslBase);
  379.   exit(0);
  380. }
  381.  
  382. void QuitScreen(void)
  383. {
  384.   WakeWindows();
  385.   RemoveList(&CharWndList,FALSE,&CloseCharWin);
  386.   if (FontWnd)
  387.     ((struct Process *)FindTask(NULL))->pr_WindowPtr = OldWindowPtr;
  388.   CloseFontWnd();
  389.   CloseEditFontWnd(TRUE);
  390.   ClosePrefsWnd(TRUE);
  391.   CloseAssignWnd(TRUE);
  392.   CloseWidthWnd(TRUE);
  393.   CloseKernWnd(TRUE);
  394.   CloseSaveWnd(TRUE);
  395.   ClosePreviewWnd(TRUE);
  396.   ClrDisposeObject(&DirReqObj);
  397.   ClrDisposeObject(&SaveReqObj);
  398.   ClrDisposeObject(&SizeImage);
  399.   ClrDisposeObject(&LeftImage);
  400.   ClrDisposeObject(&RightImage);
  401.   ClrDisposeObject(&UpImage);
  402.   ClrDisposeObject(&DownImage);
  403.   if (ScrDrawInfo)
  404.   {
  405.     FreeScreenDrawInfo(Screen,ScrDrawInfo); ScrDrawInfo = NULL;
  406.   }
  407.   if (Screen)
  408.   {
  409.     if (CustomScreen)
  410.     {
  411.       PubScreenStatus(Screen,PSNF_PRIVATE);
  412.       while (CloseScreen(Screen) == FALSE) WarnVisitors();
  413.       if (ScrFont)
  414.       {
  415.     CloseFont(ScrFont); ScrFont = NULL;
  416.       }
  417.     }
  418.     else UnlockPubScreen(NULL,Screen);
  419.     Screen = NULL;
  420.   }
  421. }
  422.  
  423. void MsgLoop(void)
  424. {
  425. ULONG signal,winsig,code,scroll_pos,pressed,old_height,left,first,last;
  426. ULONG old_bline,shift;
  427. LONG temp,normal,height;
  428. BOOL free_node,redraw = FALSE;
  429. struct CharNode *node,*oldnode;
  430. Object *charobj;
  431. char *fontstr;
  432. BPTR lock;
  433. int i;
  434.  
  435.   GetAttr(WINDOW_SigMask,FontWndObj,&winsig);
  436.   GetAttr(EXT_Object,CharObj,&charobj);
  437.   while (TRUE)
  438.   {
  439.     signal = Wait(winsig|SIGBREAKF_CTRL_C);
  440.     if (signal & SIGBREAKF_CTRL_C) Quit();
  441.     if (signal & winsig)
  442.     {
  443.       while ((code = CheckObjMsg(FontWnd,FontWndObj)) != WMHI_NOMORE)
  444.       {
  445.     switch (code)
  446.     {
  447.       case WMHI_CLOSEWINDOW:
  448.         CheckQuit();
  449.         break;
  450.       case ID_CHARSCROLL:
  451.         GetAttr(CG_Pos,charobj,&temp);
  452.         GetAttr(PGA_TOP,ScrollObj,&scroll_pos);
  453.         if (temp != scroll_pos) SetGadgetAttrs(charobj,FontWnd,NULL,
  454.           CG_Pos,scroll_pos,
  455.           CG_Redraw,FALSE,TAG_DONE);
  456.         break;
  457.       case ID_CHARS:
  458.         GetAttr(CG_Pressed,charobj,&pressed);
  459.         SetGadgetAttrs(charobj,FontWnd,NULL,CG_Pressed,~0,TAG_DONE);
  460.         GetAttr(CG_ShiftDown,charobj,&shift);
  461.         if (InvertShift) shift = !shift;
  462.         if (pressed != ~0) CheckOpenCharWin(pressed,shift);
  463.         break;
  464.       default:
  465.         SharedMsgs(code,NULL);
  466.         break;
  467.     }
  468.       }
  469.       while ((code = CheckObjMsg(ParamWnd,ParamWndObj)) != WMHI_NOMORE)
  470.       {
  471.     switch (code)
  472.     {
  473.       case WMHI_CLOSEWINDOW:
  474.       case ID_CANCEL:
  475.         CloseEditFontWnd(FALSE);
  476.         break;
  477.       case ID_BOLD:
  478.       case ID_ITALIC:
  479.       case ID_ULINE:
  480.       case ID_EXTEND:
  481.         GetAttr(GA_Selected,BoldCheck,&normal);
  482.         GetAttr(GA_Selected,ItalicCheck,&temp);
  483.         normal |= temp;
  484.         GetAttr(GA_Selected,UnderCheck,&temp);
  485.         normal |= temp;
  486.         GetAttr(GA_Selected,ExtCheck,&temp);
  487.         normal |= temp;
  488.         SetGadgetAttrs(NormalCheck,ParamWnd,NULL,
  489.           GA_Selected,normal == 0,TAG_DONE);
  490.         break;
  491.       case ID_NORMAL:
  492.         SetGadgetAttrs(BoldCheck,ParamWnd,NULL,
  493.           GA_Selected,FALSE,TAG_DONE);
  494.         SetGadgetAttrs(ItalicCheck,ParamWnd,NULL,
  495.           GA_Selected,FALSE,TAG_DONE);
  496.         SetGadgetAttrs(UnderCheck,ParamWnd,NULL,
  497.           GA_Selected,FALSE,TAG_DONE);
  498.         SetGadgetAttrs(ExtCheck,ParamWnd,NULL,
  499.           GA_Selected,FALSE,TAG_DONE);
  500.         break;
  501.       case ID_BLANK:
  502.         CheckOpenCharWin(256,0);
  503.         break;
  504.       case ID_ACCEPT:
  505.         FlagError = FALSE;
  506.         GetAttr(GA_Selected,NormalCheck,&Normal);
  507.         GetAttr(GA_Selected,BoldCheck,&Bold);
  508.         GetAttr(GA_Selected,ItalicCheck,&Italic);
  509.         GetAttr(GA_Selected,UnderCheck,&ULine);
  510.         GetAttr(GA_Selected,ExtCheck,&Extended);
  511.         GetAttr(GA_Selected,RevCheck,&Reversed);
  512.         GetAttr(CYC_Active,AspectCycle,&Aspect);
  513.  
  514.         GetAttr(STRINGA_LongVal,SmearInt,&temp);
  515.         PutPositive(ParamWnd,GetString(msgBoldSmear),temp,0,&Smear);
  516.  
  517.         GetAttr(STRINGA_LongVal,HeightInt,&temp);
  518.         old_height = Height;
  519.         PutPositive(ParamWnd,GetString(msgFontHeight),temp,1,&Height);
  520.         if (old_height != Height)
  521.         {
  522.           redraw = TRUE;
  523.           NewHeights();
  524.         }
  525.  
  526.         old_bline = Baseline;
  527.         GetAttr(STRINGA_LongVal,BaseInt,&temp);
  528.         if (temp >= (LONG)Height)
  529.         {
  530.           if (redraw)
  531.           {
  532.         Baseline = Height-1;
  533.           }
  534.           else
  535.           {
  536.         ShowReq(GetString(msgErrorBaseline),GetString(msgContinue));
  537.         FlagError = TRUE;
  538.           }
  539.         }
  540.         else PutPositive(ParamWnd,GetString(msgFontBaseline),temp,0,
  541.           &Baseline);
  542.         if (old_bline != Baseline) redraw = TRUE;
  543.  
  544.         GetAttr(CYC_Active,PropCycle,&temp);
  545.         if (temp != Proportional)
  546.         {
  547.           if ((Proportional = temp) == FALSE)
  548.           {
  549.         if (ShowReq(GetString(msgWarnPropChange),
  550.           GetString(msgYesNo)) != 0)
  551.         {
  552.           redraw = TRUE;
  553.           NewWidths();
  554.         }
  555.           }
  556.         }
  557.  
  558.         GetAttr(STRINGA_LongVal,WidthInt,&temp);
  559.         if (temp >= 0)
  560.         {
  561.           if (temp != Width)
  562.           {
  563.         Width = temp;
  564.         if (Proportional == FALSE)
  565.         {
  566.           redraw = TRUE;
  567.           NewWidths();
  568.         }
  569.           }
  570.         }
  571.         else
  572.         {
  573.           ShowReq(GetString(msgErrorFontWidth),GetString(msgContinue));
  574.           FlagError = TRUE;
  575.         }
  576.  
  577.         if (FlagError == FALSE) CloseEditFontWnd(FALSE);
  578.         if (redraw == TRUE)
  579.         {
  580.           RedrawAll();
  581.           redraw = FALSE;
  582.         }
  583.         break;
  584.       default:
  585.         SharedMsgs(code,NULL);
  586.         break;
  587.     }
  588.       }
  589.       while ((code = CheckObjMsg(PrefsWnd,PrefsWndObj)) != WMHI_NOMORE)
  590.       {
  591.     switch (code)
  592.     {
  593.       case WMHI_CLOSEWINDOW:
  594.       case ID_CANCEL:
  595.         ClosePrefsWnd(FALSE);
  596.         break;
  597.       case ID_CUSTOM:
  598.         GetAttr(GA_Selected,CustButton,&temp);
  599.         SetGadgetAttrs(ModeButton,PrefsWnd,NULL,
  600.           GA_Disabled,(temp == TRUE) ? FALSE : TRUE,TAG_DONE);
  601.         SetGadgetAttrs(FontButton,PrefsWnd,NULL,
  602.           GA_Disabled,(temp == TRUE) ? FALSE : TRUE,TAG_DONE);
  603.         SetGadgetAttrs(PubStr,PrefsWnd,NULL,
  604.           STRINGA_TextVal,GetPubName(temp),TAG_DONE);
  605.         break;
  606.       case ID_CHOOSEMODE:
  607.         SleepWindows();
  608.         if (AslBase->lib_Version > 37)
  609.         {
  610.           if (AslRequestTags(PrefsScrReq,
  611.         ASLSM_Window,PrefsWnd,
  612.         ASLSM_InitialDisplayID,PrefScrModeID,
  613.         ASLSM_InitialDisplayDepth,PrefScrDepth,TAG_DONE))
  614.           {
  615.         PrefScrModeID = PrefsScrReq->sm_DisplayID;
  616.         PrefScrDepth = PrefsScrReq->sm_DisplayDepth;
  617.         GetDisplayInfoData(NULL,&ModeIDName,
  618.           sizeof(struct NameInfo),DTAG_NAME,PrefScrModeID);
  619.         SetGadgetAttrs(ModeInfo,PrefsWnd,NULL,
  620.           INFO_TextFormat,ModeIDName.Name,TAG_DONE);
  621.           }
  622.         }
  623.         else ShowReq(GetString(msgNeedAslV38),GetString(msgCancel));
  624.         WakeWindows();
  625.         break;
  626.       case ID_CHOOSEFONT:
  627.         SleepWindows();
  628.         if (AslRequestTags(PrefsFontReq,
  629.           ASLFO_Window,PrefsWnd,
  630.           ASLFO_InitialName,PrefScrFontName,
  631.           ASLFO_InitialSize,PrefScrFontHeight,
  632.           ASLFO_FixedWidthOnly,FALSE,TAG_DONE))
  633.         {
  634.           strcpy(PrefScrFontName,PrefsFontReq->fo_Attr.ta_Name);
  635.           PrefScrFontHeight = PrefsFontReq->fo_Attr.ta_YSize;
  636.           WriteFont(PrefScrBuffer,PrefScrFontName,PrefScrFontHeight);
  637.           SetGadgetAttrs(FontInfo,PrefsWnd,NULL,
  638.         INFO_TextFormat,PrefScrBuffer,TAG_DONE);
  639.         }
  640.         WakeWindows();
  641.         break;
  642.       case ID_CHOOSEFIXFONT:
  643.         SleepWindows();
  644.         if (AslRequestTags(PrefsFontReq,
  645.           ASLFO_Window,PrefsWnd,
  646.           ASLFO_InitialName,PrefFixFontName,
  647.           ASLFO_InitialSize,PrefFixFontHeight,
  648.           ASLFO_FixedWidthOnly,TRUE,TAG_DONE))
  649.         {
  650.           strcpy(PrefFixFontName,PrefsFontReq->fo_Attr.ta_Name);
  651.           PrefFixFontHeight = PrefsFontReq->fo_Attr.ta_YSize;
  652.           WriteFont(PrefFixBuffer,PrefFixFontName,PrefFixFontHeight);
  653.           SetGadgetAttrs(ChrFontInfo,PrefsWnd,NULL,
  654.         INFO_TextFormat,PrefFixBuffer,TAG_DONE);
  655.         }
  656.         WakeWindows();
  657.         break;
  658.       case ID_PUBNAME:
  659.         CopyPubName();
  660.         break;
  661.       case ID_AUTOHEIGHT:
  662.         GetAttr(GA_Selected,AutoCheck,&temp);
  663.         SetGadgetAttrs(VecInt,PrefsWnd,NULL,GA_Disabled,temp,TAG_DONE);
  664.         break;
  665.       case ID_ACCEPT:
  666.       case ID_USE:
  667.         FlagError = FALSE;
  668.         NewCustom = CustomScreen;
  669.         NewWindow = FALSE;
  670.         GetAttr(GA_Selected,CustButton,&temp);
  671.  
  672.         if (temp != CustomScreen)
  673.         {
  674.           ChangeScreen = TRUE;
  675.           NewCustom = (CustomScreen == TRUE) ? FALSE : TRUE;
  676.         }
  677.  
  678.         if (temp == TRUE)
  679.         {
  680.           if ((PrefScrModeID != Prefs.ScrModeID) ||
  681.         (PrefScrDepth != Prefs.ScrDepth))
  682.           {
  683.         ChangeScreen = TRUE;
  684.         NewCustom = TRUE;
  685.           }
  686.         }
  687.         Prefs.ScrModeID = PrefScrModeID;
  688.         Prefs.ScrDepth = PrefScrDepth;
  689.  
  690.         if (temp == TRUE)
  691.         {
  692.           if ((stricmp(PrefScrFontName,Prefs.ScrFontName) != 0) ||
  693.         (PrefScrFontHeight != Prefs.ScrFontHeight))
  694.           {
  695.         ChangeScreen = TRUE;
  696.         NewCustom = TRUE;
  697.           }
  698.         }
  699.         strcpy(Prefs.ScrFontName,PrefScrFontName);
  700.         Prefs.ScrFontHeight = PrefScrFontHeight;
  701.  
  702.         CopyPubName();
  703.         if (temp == TRUE)
  704.         {
  705.           if (stricmp(PrefThisPubName,Prefs.ThisPubName) != 0)
  706.           {
  707.         ChangeScreen = TRUE;
  708.             NewCustom = TRUE;
  709.           }
  710.         }
  711.         else
  712.         {
  713.           if (stricmp(PrefDefPubName,Prefs.DefPubName) != 0)
  714.           {
  715.         ChangeScreen = TRUE;
  716.             NewCustom = FALSE;
  717.           }
  718.         }
  719.         strcpy(Prefs.ThisPubName,PrefThisPubName);
  720.         strcpy(Prefs.DefPubName,PrefDefPubName);
  721.  
  722.         GetAttr(STRINGA_LongVal,VecInt,&temp);
  723.         PutPositive(PrefsWnd,GetString(msgToolbarHeight),temp,10,
  724.           &(Prefs.VecHeight));
  725.         for (i = 0; i < MAX_TBAR; i++)
  726.         {
  727.           GetAttr(GA_Selected,TBarObj[i],&temp);
  728.           if (temp == 0)
  729.         Prefs.ToolBar &= ~(1 << i);
  730.           else
  731.         Prefs.ToolBar |= (1 << i);
  732.         }
  733.         GetAttr(GA_Selected,AutoCheck,&temp);
  734.         AutoHeight = temp ? TRUE : FALSE;
  735.         if (AutoHeight) Prefs.VecHeight = SizeY(11);
  736.  
  737.         GetAttr(STRINGA_LongVal,PixelXInt,&temp);
  738.         PutPositive(PrefsWnd,GetString(msgPixelWidth),temp,1,
  739.           &(Prefs.PixelX));
  740.         GetAttr(STRINGA_LongVal,PixelYInt,&temp);
  741.         PutPositive(PrefsWnd,GetString(msgPixelHeight),temp,1,
  742.           &(Prefs.PixelY));
  743.         GetAttr(CYC_Active,PixelCycle,&PixelBorder);
  744.         GetAttr(GA_Selected,MaxCheck,&temp);
  745.         MaxWindow = temp ? TRUE : FALSE;
  746.         GetAttr(GA_Selected,BLineCheck,&temp);
  747.         ShowBLine = temp ? TRUE : FALSE;
  748.  
  749.         GetAttr(GA_Selected,ShiftCheck,&temp);
  750.         InvertShift = temp ? TRUE : FALSE;
  751.         GetAttr(GA_Selected,SizeCheck,&temp);
  752.         if (Prefs.CharSize != temp)
  753.         {
  754.           Prefs.CharSize = temp;
  755.           NewWindow = TRUE;
  756.         }
  757.         GetAttr(CYC_Active,ChrWCycle,&temp);
  758.         if (Prefs.CharWidth != temp)
  759.         {
  760.           Prefs.CharWidth = temp;
  761.           NewWindow = TRUE;
  762.         }
  763.         GetAttr(STRINGA_LongVal,ChrHInt,&temp);
  764.         height = 0;
  765.         PutPositive(PrefsWnd,GetString(msgSelWndWidth),temp,0,&height);
  766.         if (height > 0)
  767.         {
  768.           if (height*(4<<Prefs.CharWidth) > 256)
  769.         height = 256/(4<<Prefs.CharWidth);
  770.           if (Prefs.CharHeight != height)
  771.           {
  772.         Prefs.CharHeight = height;
  773.         NewWindow = TRUE;
  774.           }
  775.         }
  776.         if ((stricmp(PrefFixFontName,Prefs.FixedFontName) != 0) ||
  777.           (PrefFixFontHeight != Prefs.FixedFontHeight)) NewWindow = TRUE;
  778.         strcpy(Prefs.FixedFontName,PrefFixFontName);
  779.         Prefs.FixedFontHeight = PrefFixFontHeight;
  780.  
  781.         GetAttr(CYC_Active,SaveCycle,&(Prefs.SaveTo));
  782.         GetAttr(GA_Selected,QuitCheck,&temp);
  783.         ConfirmQuit = temp ? TRUE : FALSE;
  784.  
  785.         if (code == ID_ACCEPT)
  786.         {
  787.           if (Prefs.SaveTo == 0)
  788.           {
  789.         SavePrefs("ENV:"NAME".prefs");
  790.         SavePrefs("ENVARC:"NAME".prefs");
  791.           }
  792.           else SavePrefs("PROGDIR:"NAME".prefs");
  793.         }
  794.         if (FlagError == FALSE) ClosePrefsWnd(FALSE);
  795.         break;
  796.       default:
  797.         SharedMsgs(code,NULL);
  798.         break;
  799.     }
  800.       }
  801.       while ((code = CheckObjMsg(AssignWnd,AssignWndObj)) != WMHI_NOMORE)
  802.       {
  803.     switch (code)
  804.     {
  805.       case WMHI_CLOSEWINDOW:
  806.       case ID_CANCEL:
  807.         CloseAssignWnd(FALSE);
  808.         break;
  809.       case ID_ASSIGN:
  810.       case ID_ASSIGNADD:
  811.         GetAttr(STRINGA_TextVal,FontDirStr,&fontstr);
  812.         strcpy(FontPath,fontstr);
  813.         SleepWindows();
  814.         if ((lock = Lock(FontPath,ACCESS_READ)) != 0)
  815.         {
  816.           if (code == ID_ASSIGNADD)
  817.         AssignAdd("FONTS",lock);
  818.           else
  819.         AssignLock("FONTS",lock);
  820.           strcpy(SavePath,FontPath);
  821.           FlushAllFonts();
  822.         }
  823.         else ShowReq(GetString(msgNoDir),GetString(msgCancel),FontPath);
  824.         WakeWindows();
  825.         CloseAssignWnd(FALSE);
  826.         break;
  827.       case ID_ASSIGNPATH:
  828.         SleepWindows();
  829.         GetAttr(STRINGA_TextVal,FontDirStr,&fontstr);
  830.         SetAttrs(DirReqObj,ASLFR_InitialDrawer,fontstr,TAG_DONE);
  831.         if (DoRequest(DirReqObj) == FRQ_OK)
  832.         {
  833.           GetAttr(FRQ_Drawer,DirReqObj,&fontstr);
  834.           SetGadgetAttrs(FontDirStr,AssignWnd,NULL,
  835.         STRINGA_TextVal,fontstr,TAG_DONE);
  836.         }
  837.         WakeWindows();
  838.         break;
  839.       default:
  840.         SharedMsgs(code,NULL);
  841.         break;
  842.     }
  843.       }
  844.       while ((code = CheckObjMsg(PreviewWnd,PreviewWndObj)) != WMHI_NOMORE)
  845.       {
  846.     switch (code)
  847.     {
  848.       case WMHI_CLOSEWINDOW:
  849.       case ID_CANCEL:
  850.         ClosePreviewWnd(FALSE);
  851.         break;
  852.       default:
  853.         PreviewMsgs(code);
  854.         break;
  855.     }
  856.       }
  857.       while ((code = CheckObjMsg(WidthWnd,WidthWndObj)) != WMHI_NOMORE)
  858.       {
  859.     switch (code)
  860.     {
  861.       case WMHI_CLOSEWINDOW:
  862.       case ID_CANCEL:
  863.         CloseWidthWnd(FALSE);
  864.         break;
  865.       case ID_ACCEPT:
  866.         GetAttr(STRINGA_LongVal,ChrWidthInt,&temp);
  867.         GetAttr(PGA_Top,ChrWidthScroll,&left);
  868.         if (temp >= 0)
  869.         {
  870.           if (temp > WidthChar->chr_Width)
  871.         ChangeCharWidth(WidthChar,temp,left,0);
  872.           else
  873.         ChangeCharWidth(WidthChar,temp,0,left);
  874.           RedrawEdit(WidthNode);
  875.           CloseWidthWnd(FALSE);
  876.         }
  877.         else ShowReq(GetString(msgErrorFontWidth),
  878.           GetString(msgContinue));
  879.         break;
  880.       case ID_CHARWIDTH:
  881.         GetAttr(STRINGA_LongVal,ChrWidthInt,&temp);
  882.         if (temp >= 0)
  883.         {
  884.           SetGadgetAttrs(ChrWidthScroll,WidthWnd,NULL,
  885.         PGA_Total,MAX(WidthChar->chr_Width,temp),
  886.         PGA_Visible,MIN(WidthChar->chr_Width,temp),TAG_DONE);
  887.         }
  888.         else
  889.         {
  890.           ShowReq(GetString(msgErrorFontWidth),GetString(msgContinue));
  891.           SetGadgetAttrs(ChrWidthInt,WidthWnd,NULL,
  892.         STRINGA_LongVal,WidthChar->chr_Width,TAG_DONE);
  893.         }
  894.         break;
  895.       default:
  896.         SharedMsgs(code,WidthNode);
  897.         break;
  898.     }
  899.       }
  900.       while ((code = CheckObjMsg(KernWnd,KernWndObj)) != WMHI_NOMORE)
  901.       {
  902.     switch (code)
  903.     {
  904.       case WMHI_CLOSEWINDOW:
  905.       case ID_CANCEL:
  906.         CloseKernWnd(FALSE);
  907.         break;
  908.       case ID_ACCEPT:
  909.         GetAttr(STRINGA_LongVal,SpaceObj,&temp);
  910.         SpaceTable[KernNode->chln_Number] = temp;
  911.         GetAttr(STRINGA_LongVal,KernObj,&temp);
  912.         KernTable[KernNode->chln_Number] = temp;
  913.         CloseKernWnd(FALSE);
  914.         break;
  915.       default:
  916.         SharedMsgs(code,KernNode);
  917.         break;
  918.     }
  919.       }
  920.       while ((code = CheckObjMsg(SaveWnd,SaveWndObj)) != WMHI_NOMORE)
  921.       {
  922.     switch (code)
  923.     {
  924.       case WMHI_CLOSEWINDOW:
  925.       case ID_CANCEL:
  926.         CloseSaveWnd(FALSE);
  927.         break;
  928.       case ID_ACCEPT:
  929.         GetAttr(STRINGA_LongVal,FirstNum,&first);
  930.         if ((first < 0) || (first > 255))
  931.           SaveShowReq(GetString(msgFirstRange),GetString(msgCancel));
  932.         else
  933.         {
  934.           GetAttr(STRINGA_LongVal,LastNum,&last);
  935.           if ((last < 0) || (last > 255))
  936.         SaveShowReq(GetString(msgLastRange),GetString(msgCancel));
  937.           else
  938.           {
  939.         if (first > last) SaveShowReq(GetString(msgFirstGreaterLast),
  940.           GetString(msgCancel));
  941.         else
  942.         {
  943.           FirstChar = first;
  944.           LastChar = last;
  945.           GetAttr(STRINGA_TextVal,SaveDirStr,&fontstr);
  946.           strcpy(SavePath,fontstr);
  947.           GetAttr(STRINGA_TextVal,FontNameStr,&fontstr);
  948.           strcpy(FontName,fontstr);
  949.           GetAttr(GA_Selected,TableCheck,&UseTable);
  950.           SaveFont(UseTable,FALSE);
  951.           sprintf(WinTitle,"%s/%ld",FontName,Height);
  952.           SetAttrs(FontWndObj,WINDOW_Title,WinTitle,TAG_DONE);
  953.           CloseSaveWnd(FALSE);
  954.         }
  955.           }
  956.         }
  957.         break;
  958.       case ID_GETSAVEDIR:
  959.         GetAttr(STRINGA_TextVal,SaveDirStr,&fontstr);
  960.         SetAttrs(SaveReqObj,
  961.           ASLFR_Window,SaveWnd,
  962.           ASLFR_InitialDrawer,fontstr,TAG_DONE);
  963.         WindowBusy(SaveWndObj);
  964.         if (DoRequest(SaveReqObj) == FRQ_OK)
  965.         {
  966.           GetAttr(FRQ_Drawer,SaveReqObj,&fontstr);
  967.           SetGadgetAttrs(SaveDirStr,SaveWnd,NULL,
  968.         STRINGA_TextVal,fontstr,TAG_DONE);
  969.         }
  970.         WindowReady(SaveWndObj);
  971.         break;
  972.     }
  973.       }
  974.       node = CharWndList->lh_Head;
  975.       while (node->chln_Node.ln_Succ)
  976.       {
  977.     free_node = FALSE;
  978.     while ((code =
  979.       CheckObjMsg(node->chln_Window,node->chln_Object)) != WMHI_NOMORE)
  980.     {
  981.       switch (code)
  982.       {
  983.         case WMHI_CLOSEWINDOW:
  984.           CloseCharWin(node);
  985.           free_node = TRUE;
  986.           break;
  987.         default:
  988.           SharedMsgs(code,node);
  989.           break;
  990.       }
  991.     }
  992.     oldnode = node;
  993.     node = node->chln_Node.ln_Succ;
  994.     if (free_node)
  995.     {
  996.       Remove(oldnode);
  997.       FreeVec(oldnode);
  998.     }
  999.       }
  1000.     }
  1001.     if ((ChangeScreen) && (PrefsWnd == NULL))
  1002.     {
  1003.       QuitScreen();
  1004.       CustomScreen = NewCustom;
  1005.       SetupScreen();
  1006.       SetAttrs(FontWndObj,WINDOW_Title,WinTitle,TAG_DONE);
  1007.       GetAttr(WINDOW_SigMask,FontWndObj,&winsig);
  1008.       GetAttr(EXT_Object,CharObj,&charobj);
  1009.       ChangeScreen = FALSE;
  1010.       NewWindow = FALSE;
  1011.     }
  1012.     if ((NewWindow) && (PrefsWnd == NULL))
  1013.     {
  1014.       if (FontWnd)
  1015.       {
  1016.     ((struct Process *)FindTask(NULL))->pr_WindowPtr = OldWindowPtr;
  1017.     CloseFontWnd();
  1018.     OpenFontWnd();
  1019.     NewWindow = FALSE;
  1020.       }
  1021.     }
  1022.   }
  1023. }
  1024.  
  1025. ULONG CheckObjMsg(struct Window *wnd, Object *obj)
  1026. {
  1027.   return ((wnd != NULL) ? HandleEvent(obj) : WMHI_NOMORE);
  1028. }
  1029.  
  1030. void CheckOpenCharWin(ULONG pressed, ULONG shift)
  1031. {
  1032. struct CharNode *node;
  1033. struct Character *oldchar;
  1034. BOOL open = FALSE;
  1035.  
  1036.   node = CharWndList->lh_Head;
  1037.   while (node->chln_Node.ln_Succ)
  1038.   {
  1039.     if (pressed == node->chln_Number)
  1040.     {
  1041.       open = TRUE;
  1042.       WindowToFront(node->chln_Window);
  1043.       ActivateWindow(node->chln_Window);
  1044.     }
  1045.     node = node->chln_Node.ln_Succ;
  1046.   }
  1047.   if (open == FALSE)
  1048.   {
  1049.     if (shift != 0)
  1050.     {
  1051.       node = CharWndList->lh_Head;
  1052.       if (node->chln_Node.ln_Succ)
  1053.       {
  1054.     oldchar = node->chln_Character;
  1055.     node->chln_Character = CharBuffer+pressed;
  1056.     node->chln_Number = pressed;
  1057.     SetGadgetAttrs(node->chln_EditGadg,node->chln_Window,NULL,
  1058.       EG_CharNode,node,
  1059.       EG_CharStruct,node->chln_Character,TAG_DONE);
  1060.     if (pressed > 0)
  1061.       sprintf(node->chln_Title,GetString(msgCharTitle),
  1062.         (char)pressed,pressed,pressed);
  1063.     else
  1064.       sprintf(node->chln_Title,GetString(msgZeroTitle));
  1065.     RedrawEdit(node);
  1066.     SetAttrs(node->chln_Object,WINDOW_Title,node->chln_Title,TAG_DONE);
  1067.     WindowToFront(node->chln_Window);
  1068.     ActivateWindow(node->chln_Window);
  1069.     if (oldchar == WidthChar) OpenWidthWnd(node);
  1070.     if (oldchar == KernChar) OpenKernWnd(node);
  1071.       }
  1072.       else OpenCharWin(pressed,CharSize);
  1073.     }
  1074.     else OpenCharWin(pressed,CharSize);
  1075.   }
  1076. }
  1077.  
  1078. void SharedMsgs(ULONG code,struct CharNode *node)
  1079. {
  1080.   switch (code)
  1081.   {
  1082.     case ID_OPEN:
  1083.       SleepWindows();
  1084.       if (AslRequestTags(FontReq,ASLFO_Window,FontWnd,TAG_DONE))
  1085.       {
  1086.     LoadFont(&FontReq->fo_Attr);
  1087.     WakeWindows();
  1088.     if (ParamWnd)
  1089.     {
  1090.       SetGadgetAttrs(PropCycle,ParamWnd,NULL,
  1091.         CYC_Active,Proportional,TAG_DONE);
  1092.       SetGadgetAttrs(HeightInt,ParamWnd,NULL,
  1093.         STRINGA_LongVal,Height,TAG_DONE);
  1094.       SetGadgetAttrs(WidthInt,ParamWnd,NULL,
  1095.         STRINGA_LongVal,Width,TAG_DONE);
  1096.       SetGadgetAttrs(BaseInt,ParamWnd,NULL,
  1097.         STRINGA_LongVal,Baseline,TAG_DONE);
  1098.       SetGadgetAttrs(SmearInt,ParamWnd,NULL,
  1099.         STRINGA_LongVal,Smear,TAG_DONE);
  1100.       SetGadgetAttrs(NormalCheck,ParamWnd,NULL,
  1101.         GA_Selected,Normal,TAG_DONE);
  1102.       SetGadgetAttrs(BoldCheck,ParamWnd,NULL,
  1103.         GA_Selected,Bold,TAG_DONE);
  1104.       SetGadgetAttrs(ItalicCheck,ParamWnd,NULL,
  1105.         GA_Selected,Italic,TAG_DONE);
  1106.       SetGadgetAttrs(UnderCheck,ParamWnd,NULL,
  1107.         GA_Selected,ULine,TAG_DONE);
  1108.       SetGadgetAttrs(ExtCheck,ParamWnd,NULL,
  1109.         GA_Selected,Extended,TAG_DONE);
  1110.       SetGadgetAttrs(RevCheck,ParamWnd,NULL,
  1111.         GA_Selected,Reversed,TAG_DONE);
  1112.       SetGadgetAttrs(AspectCycle,ParamWnd,NULL,
  1113.         CYC_Active,Aspect,TAG_DONE);
  1114.     }
  1115.     RedrawAll();
  1116.       }
  1117.       else WakeWindows();
  1118.       break;
  1119.     case ID_SAVE:
  1120.       OpenSaveWnd();
  1121.       break;
  1122.     case ID_CHANGEDIR:
  1123.       OpenAssignWnd();
  1124.       break;
  1125.     case ID_PREVIEW:
  1126.       OpenPreviewWnd();
  1127.       break;
  1128.     case ID_EDITFONT:
  1129.       OpenEditFontWnd();
  1130.       break;
  1131.     case ID_PREFS:
  1132.       OpenPrefsWnd();
  1133.       break;
  1134.     case ID_ABOUT:
  1135.       OpenAboutWnd();
  1136.       break;
  1137.     case ID_QUIT:
  1138.       CheckQuit();
  1139.       break;
  1140.     case ID_WIDTHL:
  1141.       if (node)
  1142.       {
  1143.     if (node->chln_Character->chr_Width > 0)
  1144.     {
  1145.       ChangeCharWidth(node->chln_Character,
  1146.         node->chln_Character->chr_Width-1,0,0);
  1147.       RedrawEdit(node);
  1148.     }
  1149.       }
  1150.       break;
  1151.     case ID_WIDTHR:
  1152.       if (node)
  1153.       {
  1154.     ChangeCharWidth(node->chln_Character,
  1155.       node->chln_Character->chr_Width+1,0,0);
  1156.       RedrawEdit(node);
  1157.       }
  1158.       break;
  1159.     case ID_WIDTHC:
  1160.       if (node) OpenWidthWnd(node);
  1161.       break;
  1162.     case ID_KERNING:
  1163.       if (node) OpenKernWnd(node);
  1164.       break;
  1165.     case ID_MOVEL:
  1166.       if (node) MoveLeft(node,NULL);
  1167.       break;
  1168.     case ID_MOVER:
  1169.       if (node) MoveRight(node,NULL);
  1170.       break;
  1171.     case ID_MOVEU:
  1172.       if (node) MoveUp(node,NULL);
  1173.       break;
  1174.     case ID_MOVED:
  1175.       if (node) MoveDown(node,NULL);
  1176.       break;
  1177.     case ID_COPY:
  1178.       if (node) CopyChar(node);
  1179.       break;
  1180.     case ID_PASTE:
  1181.       if (node) PasteChar(node);
  1182.       break;
  1183.     case ID_MOVEFL:
  1184.       MoveAll(MoveLeft);
  1185.       break;
  1186.     case ID_MOVEFR:
  1187.       MoveAll(MoveRight);
  1188.       break;
  1189.     case ID_MOVEFU:
  1190.       MoveAll(MoveUp);
  1191.       break;
  1192.     case ID_MOVEFD:
  1193.       MoveAll(MoveDown);
  1194.       break;
  1195.     case ID_RESETKERN:
  1196.       ResetKerning();
  1197.       break;
  1198.     case ID_ZOOMIN:
  1199.       if (node) ZoomIn(node);
  1200.       break;
  1201.     case ID_ZOOMOUT:
  1202.       if (node) ZoomOut(node);
  1203.       break;
  1204.   }
  1205. }
  1206.  
  1207. void Error(char *message)
  1208. {
  1209.   ShowReq(message,GetString(msgCancel));
  1210.   Quit();
  1211. }
  1212.  
  1213. LONG ShowReq(char *text,char *gadgets,...)
  1214. {
  1215. va_list va;
  1216. LONG req_return;
  1217. struct EasyStruct req =
  1218.   { sizeof(struct EasyStruct),0,NAME,NULL,NULL };
  1219.  
  1220.   SleepWindows();
  1221.   req.es_TextFormat = text;
  1222.   req.es_GadgetFormat = gadgets;
  1223.   va_start(va,gadgets);
  1224.   req_return = EasyRequestArgs(FontWnd,&req,NULL,va);
  1225.   va_end(va);
  1226.   WakeWindows();
  1227.   return req_return;
  1228. }
  1229.  
  1230. void ClrDisposeObject(Object **obj)
  1231. {
  1232.   if (*obj)
  1233.   {
  1234.     DisposeObject(*obj);
  1235.     *obj = NULL;
  1236.   }
  1237. }
  1238.  
  1239. void ClrWindowClose(Object **obj,struct Window **wnd)
  1240. {
  1241.   if (*wnd)
  1242.   {
  1243.     WindowClose(*obj);
  1244.     *wnd = NULL;
  1245.   }
  1246. }
  1247.  
  1248. void SleepWindows(void)
  1249. {
  1250. struct CharNode *node;
  1251.  
  1252.   if (FontWnd)
  1253.   {
  1254.     WindowBusy(FontWndObj);
  1255.     if (ParamWnd) WindowBusy(ParamWndObj);
  1256.     if (PrefsWnd) WindowBusy(PrefsWndObj);
  1257.     if (AssignWnd) WindowBusy(AssignWndObj);
  1258.     if (WidthWnd) WindowBusy(WidthWndObj);
  1259.     if (KernWnd) WindowBusy(KernWndObj);
  1260.     if (PreviewWnd) WindowBusy(PreviewWndObj);
  1261.     node = CharWndList->lh_Head;
  1262.     while (node->chln_Node.ln_Succ)
  1263.     {
  1264.       WindowBusy(node->chln_Object);
  1265.       node = node->chln_Node.ln_Succ;
  1266.     }
  1267.   }
  1268. }
  1269.  
  1270. void WakeWindows(void)
  1271. {
  1272. struct CharNode *node;
  1273.  
  1274.   if (FontWnd)
  1275.   {
  1276.     WindowReady(FontWndObj);
  1277.     if (ParamWnd) WindowReady(ParamWndObj);
  1278.     if (PrefsWnd) WindowReady(PrefsWndObj);
  1279.     if (AssignWnd) WindowReady(AssignWndObj);
  1280.     if (WidthWnd) WindowReady(WidthWndObj);
  1281.     if (KernWnd) WindowReady(KernWndObj);
  1282.     if (PreviewWnd) WindowReady(PreviewWndObj);
  1283.     node = CharWndList->lh_Head;
  1284.     while (node->chln_Node.ln_Succ)
  1285.     {
  1286.       WindowReady(node->chln_Object);
  1287.       node = node->chln_Node.ln_Succ;
  1288.     }
  1289.   }
  1290. }
  1291.  
  1292. void LoadFont(struct TextAttr *font)
  1293. {
  1294. ULONG i;
  1295. char *endptr;
  1296.  
  1297.   strcpy(FontName,font->ta_Name);
  1298.   if (endptr = strstr(FontName,".font")) *endptr = 0;
  1299.   if ((NewFont = OpenDiskFont(font)) == NULL)
  1300.   {
  1301.     ShowReq(GetString(msgNoOpenFont),GetString(msgContinue),FontName,
  1302.       (ULONG)font->ta_YSize);
  1303.     return;
  1304.   }
  1305.   ClearCurrentFont();
  1306.   Height = NewFont->tf_YSize;
  1307.   Width = NewFont->tf_XSize;
  1308.   Baseline = NewFont->tf_Baseline;
  1309.   Smear = NewFont->tf_BoldSmear;
  1310.   FirstChar = NewFont->tf_LoChar;
  1311.   LastChar = NewFont->tf_HiChar;
  1312.   Proportional = ((NewFont->tf_Flags & FPF_PROPORTIONAL) != 0);
  1313.   Bold = ((NewFont->tf_Style & FSF_BOLD) != 0);
  1314.   Italic = ((NewFont->tf_Style & FSF_ITALIC) != 0);
  1315.   ULine = ((NewFont->tf_Style & FSF_UNDERLINED) != 0);
  1316.   Extended = ((NewFont->tf_Style & FSF_EXTENDED) != 0);
  1317.   Normal = ((Bold | Italic | ULine | Extended) == 0);
  1318.   Reversed = ((NewFont->tf_Flags & FPF_REVPATH) != 0);
  1319.   Aspect = 0;
  1320.   if (NewFont->tf_Flags & FPF_TALLDOT) Aspect = 1;
  1321.   if (NewFont->tf_Flags & FPF_WIDEDOT) Aspect = 2;
  1322.  
  1323.   for (i = 0; i < 257; i++)
  1324.   {
  1325.     (CharBuffer+i)->chr_Width = (((struct charDef *)(NewFont->tf_CharLoc))
  1326.       +LastChar-FirstChar+1)->charBitWidth;
  1327.     (CharBuffer+i)->chr_Height = NewFont->tf_YSize;
  1328.     SpaceTable[i] = NewFont->tf_XSize;
  1329.     KernTable[i] = 0;
  1330.     KernTables(i,LastChar-FirstChar+1);
  1331.   }
  1332.   for (i = 0; i < LastChar-FirstChar+1; i++)
  1333.   {
  1334.     if (!UnpackChar(CharBuffer+FirstChar+i,NewFont,i)) ErrorCode(ALLOCVEC);
  1335.     KernTables(FirstChar+i,i);
  1336.   }
  1337.   UnpackChar(CharBuffer+256,NewFont,LastChar-FirstChar+1);
  1338.   KernTables(256,LastChar-FirstChar+1);
  1339.   sprintf(WinTitle,"%s/%ld",FontName,(ULONG)font->ta_YSize);
  1340.   SetAttrs(FontWndObj,WINDOW_Title,WinTitle,TAG_DONE);
  1341.   CloseFont(NewFont); NewFont = NULL;
  1342.   DataChanged = FALSE;
  1343. }
  1344.  
  1345. BOOL UnpackChar(struct Character *chr,struct TextFont *font,ULONG i)
  1346. {
  1347. struct charDef *def;
  1348. ULONG j,k,mod,off,width,modj,widthj;
  1349. UBYTE *data;
  1350.  
  1351.   mod = font->tf_Modulo;
  1352.   data = (UBYTE *)font->tf_CharData;
  1353.   def = ((struct charDef *)(font->tf_CharLoc))+i;
  1354.   off = def->charOffset;
  1355.   chr->chr_Width = def->charBitWidth;
  1356.   if ((width = chr->chr_Width) > 0)
  1357.   {
  1358.     if ((chr->chr_Data = AllocVec(chr->chr_Width*chr->chr_Height,MEMF_ANY))
  1359.       == NULL) return (FALSE);
  1360.     for (j = 0; j < chr->chr_Height; j++)
  1361.     {
  1362.       modj = mod*j;
  1363.       widthj = width*j;
  1364.       for (k = 0; k < width; k++)
  1365.         *(chr->chr_Data+widthj+k) = GETBIT(data+modj,off+k);
  1366.     }
  1367.   }
  1368.   return (TRUE);
  1369. }
  1370.  
  1371. void KernTables(ULONG to, ULONG from)
  1372. {
  1373.   if (NewFont->tf_CharSpace)
  1374.     SpaceTable[to] = *((WORD *)(NewFont->tf_CharSpace)+from);
  1375.   if (NewFont->tf_CharKern)
  1376.     KernTable[to] = *((WORD *)(NewFont->tf_CharKern)+from);
  1377.   if ((NewFont->tf_CharSpace) || (NewFont->tf_CharKern))
  1378.     UseTable = TRUE;
  1379.   else
  1380.     UseTable = FALSE;
  1381. }
  1382.  
  1383. void ClearCurrentFont(void)
  1384. {
  1385. struct Character *chr;
  1386.  
  1387.   for (chr = CharBuffer; chr < CharBuffer+257; chr++)
  1388.   {
  1389.     if (chr->chr_Data) FreeVec(chr->chr_Data);
  1390.     chr->chr_Data = NULL;
  1391.   }
  1392. }
  1393.  
  1394. void OpenEditFontWnd(void)
  1395. {
  1396. Object *accept, *cancel;
  1397.  
  1398.   if (ParamWnd)
  1399.   {
  1400.     WindowToFront(ParamWnd);
  1401.     ActivateWindow(ParamWnd);
  1402.   }
  1403.   else
  1404.   {
  1405.     if (ParamWndObj == NULL)
  1406.     {
  1407.       PropLabels[0] = GetString(msgFontFixed);
  1408.       PropLabels[1] = GetString(msgFontProp);
  1409.       AspectLabels[0] = GetString(msgAspectNormal);
  1410.       AspectLabels[1] = GetString(msgAspectThin);
  1411.       AspectLabels[2] = GetString(msgAspectWide);
  1412.       SetupMenus(Menus);
  1413.  
  1414.       ParamWndObj = WindowObject,
  1415.     WINDOW_Screen,Screen,
  1416.     WINDOW_SharedPort,WndMsgPort,
  1417.     WINDOW_MenuStrip,Menus,
  1418.     WINDOW_Title,GetString(msgFontParamsTitle),
  1419.     WINDOW_HelpFile,NAME".guide",
  1420.     WINDOW_HelpNode,"params",
  1421.     WINDOW_SmartRefresh,TRUE,
  1422.     WINDOW_SizeGadget,FALSE,
  1423.     WINDOW_CloseOnEsc,TRUE,
  1424.     WINDOW_MasterGroup,
  1425.       VGroupObject,
  1426.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(4)),
  1427.         GROUP_BackFill,SHINE_RASTER,
  1428.         StartMember,
  1429.           VGroupObject,
  1430.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  1431.         ButtonFrame,
  1432.         FRM_Recessed,TRUE,
  1433.         StartMember,
  1434.           PropCycle = KeyCycle(GetString(gadgFontType),PropLabels,
  1435.             Proportional,ID_PROPORTIONAL),
  1436.         EndMember,
  1437.         StartMember,
  1438.           HGroupObject,
  1439.             Spacing(SizeX(8)),
  1440.             StartMember,
  1441.               VGroupObject,
  1442.             Spacing(SizeY(2)),
  1443.             StartMember,
  1444.               HeightInt = TabKeyInteger(
  1445.                 GetString(gadgFontHeight),Height,5,ID_HEIGHT),
  1446.             EndMember,
  1447.             StartMember,
  1448.               BaseInt = TabKeyInteger(
  1449.                 GetString(gadgFontBaseline),Baseline,5,
  1450.                 ID_BASELINE),
  1451.             EndMember,
  1452.               EndObject,
  1453.             EndMember,
  1454.             StartMember,
  1455.               VGroupObject,
  1456.             Spacing(SizeY(2)),
  1457.             StartMember,
  1458.               WidthInt = TabKeyInteger(GetString(gadgFontWidth),
  1459.                 Width,5,ID_WIDTH),
  1460.             EndMember,
  1461.             StartMember,
  1462.               SmearInt = TabKeyInteger(GetString(gadgBoldSmear),
  1463.                 Smear,5,ID_SMEAR),
  1464.             EndMember,
  1465.               EndObject,
  1466.             EndMember,
  1467.           EndObject,
  1468.         EndMember,
  1469.           EndObject,
  1470.         EndMember,
  1471.         StartMember,
  1472.           VGroupObject,
  1473.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  1474.         ButtonFrame,
  1475.         FRM_Recessed,TRUE,
  1476.         StartMember,
  1477.           HGroupObject,
  1478.             Spacing(SizeX(8)),
  1479.             StartMember,
  1480.               VGroupObject,
  1481.             Spacing(SizeY(2)),
  1482.             StartMember,
  1483.               NormalCheck =
  1484.                 KeyCheckBox(GetString(gadgFontNormal),Normal,
  1485.                   ID_NORMAL),
  1486.             EndMember,
  1487.             StartMember,
  1488.               ItalicCheck =
  1489.                 KeyCheckBox(GetString(gadgFontItalic),Italic,
  1490.                   ID_ITALIC),
  1491.             EndMember,
  1492.               EndObject,
  1493.             EndMember,
  1494.             StartMember,
  1495.               VGroupObject,
  1496.             Spacing(SizeY(2)),
  1497.             StartMember,
  1498.               BoldCheck = KeyCheckBox(GetString(gadgFontBold),
  1499.                 Bold,ID_BOLD),
  1500.             EndMember,
  1501.             StartMember,
  1502.               UnderCheck =
  1503.                 KeyCheckBox(GetString(gadgFontUnderline),ULine,
  1504.                   ID_ULINE),
  1505.             EndMember,
  1506.               EndObject,
  1507.             EndMember,
  1508.             StartMember,
  1509.               VGroupObject,
  1510.             Spacing(SizeY(2)),
  1511.             StartMember,
  1512.               ExtCheck =
  1513.                 KeyCheckBox(GetString(gadgFontExtended),Extended,
  1514.                   ID_EXTEND),
  1515.             EndMember,
  1516.             StartMember,
  1517.               RevCheck =
  1518.                 KeyCheckBox(GetString(gadgFontReversed),Reversed,
  1519.                   ID_REVERSE),
  1520.             EndMember,
  1521.               EndObject,
  1522.             EndMember,
  1523.           EndObject,
  1524.         EndMember,
  1525.         StartMember,
  1526.           HGroupObject,
  1527.             Spacing(SizeX(8)),
  1528.             StartMember,
  1529.               AspectCycle = KeyPopCycle(GetString(gadgFontAspect),
  1530.             AspectLabels,Aspect,ID_ASPECT),
  1531.             EndMember,
  1532.             StartMember,
  1533.               BlankButton = KeyButton(GetString(gadgFontBlank),
  1534.             ID_BLANK),
  1535.               Weight(20),
  1536.             EndMember,
  1537.           EndObject,
  1538.         EndMember,
  1539.           EndObject,
  1540.         EndMember,
  1541.         StartMember,
  1542.           HGroupObject,
  1543.         Spacing(SizeX(8)),
  1544.         EqualWidth,
  1545.         StartMember,
  1546.           accept = KeyButton(GetString(gadgAccept),ID_ACCEPT),
  1547.         EndMember,
  1548.             StartMember,
  1549.           cancel = KeyButton(GetString(gadgCancel),ID_CANCEL),
  1550.         EndMember,
  1551.           EndObject,
  1552.           FixMinHeight,
  1553.         EndMember,
  1554.       EndObject,
  1555.     EndObject;
  1556.       if (ParamWndObj == NULL) ErrorCode(NEWWINDOW);
  1557.       SetLabelKey(ParamWndObj,accept,gadgAccept);
  1558.       SetLabelKey(ParamWndObj,cancel,gadgCancel);
  1559.       SetLabelKey(ParamWndObj,PropCycle,gadgFontType);
  1560.       SetLabelKey(ParamWndObj,HeightInt,gadgFontHeight);
  1561.       SetLabelKey(ParamWndObj,WidthInt,gadgFontWidth);
  1562.       SetLabelKey(ParamWndObj,BaseInt,gadgFontBaseline);
  1563.       SetLabelKey(ParamWndObj,SmearInt,gadgBoldSmear);
  1564.       SetLabelKey(ParamWndObj,NormalCheck,gadgFontNormal);
  1565.       SetLabelKey(ParamWndObj,BoldCheck,gadgFontBold);
  1566.       SetLabelKey(ParamWndObj,ItalicCheck,gadgFontItalic);
  1567.       SetLabelKey(ParamWndObj,UnderCheck,gadgFontUnderline);
  1568.       SetLabelKey(ParamWndObj,ExtCheck,gadgFontExtended);
  1569.       SetLabelKey(ParamWndObj,RevCheck,gadgFontReversed);
  1570.       SetLabelKey(ParamWndObj,AspectCycle,gadgFontAspect);
  1571.       SetLabelKey(ParamWndObj,BlankButton,gadgFontBlank);
  1572.       DoMethod(ParamWndObj,WM_TABCYCLE_ORDER,
  1573.     HeightInt,WidthInt,BaseInt,SmearInt,NULL);
  1574.     }
  1575.  
  1576.     SetAttrs(PropCycle,CYC_Active,Proportional,TAG_DONE);
  1577.     SetAttrs(HeightInt,STRINGA_LongVal,Height,TAG_DONE);
  1578.     SetAttrs(BaseInt,STRINGA_LongVal,Baseline,TAG_DONE);
  1579.     SetAttrs(WidthInt,STRINGA_LongVal,Width,TAG_DONE);
  1580.     SetAttrs(SmearInt,STRINGA_LongVal,Smear,TAG_DONE);
  1581.     SetAttrs(NormalCheck,GA_Selected,Normal,TAG_DONE);
  1582.     SetAttrs(ItalicCheck,GA_Selected,Italic,TAG_DONE);
  1583.     SetAttrs(BoldCheck,GA_Selected,Bold,TAG_DONE);
  1584.     SetAttrs(UnderCheck,GA_Selected,ULine,TAG_DONE);
  1585.     SetAttrs(ExtCheck,GA_Selected,Extended,TAG_DONE);
  1586.     SetAttrs(RevCheck,GA_Selected,Reversed,TAG_DONE);
  1587.     SetAttrs(AspectCycle,CYC_Active,Aspect,TAG_DONE);
  1588.     if ((ParamWnd = WindowOpen(ParamWndObj)) == NULL) ErrorCode(OPENWINDOW);
  1589.   }
  1590. }
  1591.  
  1592. void CloseEditFontWnd(BOOL obj)
  1593. {
  1594.   ClrWindowClose(&ParamWndObj,&ParamWnd);
  1595.   if (obj) ClrDisposeObject(&ParamWndObj);
  1596. }
  1597.  
  1598. void OpenPrefsWnd(void)
  1599. {
  1600. Object *save, *use, *cancel, *select, *page;
  1601. static STRPTR width_labels[] = { "4","8","16","32",NULL };
  1602. static ULONG map[] = { CYC_Active,PAGE_Active,TAG_DONE };
  1603. int i;
  1604.  
  1605. extern struct VectorItem LineArrowLeft[], LineArrowRight[];
  1606. extern struct VectorItem SolidArrowLeft[], SolidArrowRight[];
  1607. extern struct VectorItem SolidArrowUp[], SolidArrowDown[];
  1608. extern struct VectorItem KernImage[], WidthImage[];
  1609. extern struct VectorItem ZoomInImage[], ZoomOutImage[];
  1610.  
  1611.   if (PrefsWnd)
  1612.   {
  1613.     WindowToFront(PrefsWnd);
  1614.     ActivateWindow(PrefsWnd);
  1615.   }
  1616.   else
  1617.   {
  1618.     if (PrefsWndObj == NULL)
  1619.     {
  1620.       PrefsPages[0] = GetString(msgPrefsScreen);
  1621.       PrefsPages[1] = GetString(msgPrefsToolBar);
  1622.       PrefsPages[2] = GetString(msgPrefsEdit);
  1623.       PrefsPages[3] = GetString(msgPrefsSelect);
  1624.       PrefsPages[4] = GetString(msgPrefsMisc);
  1625.       BorderLabels[0] = GetString(msgBorderNo);
  1626.       BorderLabels[1] = GetString(msgBorderYes);
  1627.       BorderLabels[2] = GetString(msgBorderGrid);
  1628.       SaveLabels[0] = GetString(msgPrefsEnv);
  1629.       SaveLabels[1] = GetString(msgPrefsProg);
  1630.       SetupMenus(Menus);
  1631.  
  1632.       PrefsWndObj = WindowObject,
  1633.     WINDOW_Screen,Screen,
  1634.     WINDOW_SharedPort,WndMsgPort,
  1635.     WINDOW_MenuStrip,Menus,
  1636.     WINDOW_Title,GetString(msgPrefsTitle),
  1637.     WINDOW_HelpFile,NAME".guide",
  1638.     WINDOW_HelpNode,"prefs",
  1639.     WINDOW_SmartRefresh,TRUE,
  1640.     WINDOW_SizeGadget,FALSE,
  1641.     WINDOW_CloseOnEsc,TRUE,
  1642.     WINDOW_MasterGroup,
  1643.       VGroupObject,
  1644.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(4)),
  1645.         GROUP_BackFill,SHINE_RASTER,
  1646.             StartMember,
  1647.           select = CycleObject,
  1648.         ButtonFrame,
  1649.         CYC_Labels,PrefsPages,
  1650.         CYC_Popup,TRUE,
  1651.           EndObject,
  1652.           FixMinHeight,
  1653.         EndMember,
  1654.         StartMember,
  1655.           page = PageObject,
  1656.  
  1657.         PageMember,
  1658.           VGroupObject,
  1659.             HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  1660.             ButtonFrame,
  1661.             FRM_Recessed,TRUE,
  1662.             StartMember,
  1663.               HGroupObject,
  1664.             VarSpace(50),
  1665.             StartMember,
  1666.               CustButton = KeyCheckBox(GetString(gadgCustomScr),
  1667.                 CustomScreen,ID_CUSTOM),
  1668.             EndMember,
  1669.             VarSpace(50),
  1670.               EndObject,
  1671.             EndMember,
  1672.             StartMember,
  1673.               HGroupObject,
  1674.             VarSpace(0),
  1675.             FixMinHeight,
  1676.             EqualHeight,
  1677.             StartMember,
  1678.               ModeInfo = InfoObject,
  1679.                 UScoreLabel(GetString(gadgMode),'_'),
  1680.                 ButtonFrame,
  1681.                 FRM_Flags,FRF_RECESSED,
  1682.                 INFO_MinLines,1,
  1683.                 INFO_HorizOffset,6,
  1684.                 INFO_VertOffset,4,
  1685.               EndObject,
  1686.             EndMember,
  1687.             StartMember,
  1688.               ModeButton = ButtonObject,
  1689.                 PopUp,
  1690.                 ButtonFrame,
  1691.                 GA_ID,ID_CHOOSEMODE,
  1692.               EndObject,
  1693.               FixMinWidth,
  1694.             EndMember,
  1695.               EndObject,
  1696.             EndMember,
  1697.             StartMember,
  1698.               HGroupObject,
  1699.             VarSpace(0),
  1700.             FixMinHeight,
  1701.             EqualHeight,
  1702.             StartMember,
  1703.               FontInfo = InfoObject,
  1704.                 UScoreLabel(GetString(gadgScreenFont),'_'),
  1705.                 ButtonFrame,
  1706.                 FRM_Flags,FRF_RECESSED,
  1707.                 INFO_MinLines,1,
  1708.                 INFO_HorizOffset,6,
  1709.                 INFO_VertOffset,4,
  1710.               EndObject,
  1711.             EndMember,
  1712.             StartMember,
  1713.               FontButton = ButtonObject,
  1714.                 PopUp,
  1715.                 ButtonFrame,
  1716.                 GA_ID,ID_CHOOSEFONT,
  1717.               EndObject,
  1718.               FixMinWidth,
  1719.             EndMember,
  1720.               EndObject,
  1721.             EndMember,
  1722.             StartMember,
  1723.               PubStr = StringObject,
  1724.             UScoreLabel(GetString(gadgPubScreen),'_'),
  1725.             RidgeFrame,
  1726.             STRINGA_MaxChars,MAXPUBSCREENNAME,
  1727.             GA_ID,ID_PUBNAME,
  1728.               EndObject,
  1729.               NoAlign,
  1730.               FixMinHeight,
  1731.             EndMember,
  1732.           EndObject,
  1733.  
  1734.         PageMember,
  1735.           VGroupObject,
  1736.             HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  1737.             ButtonFrame,
  1738.             FRM_Recessed,TRUE,
  1739.             VarSpace(50),
  1740.             StartMember,
  1741.               HGroupObject,
  1742.               VarSpace(50),
  1743.             StartMember,
  1744.               HGroupObject,
  1745.                 HOffset(SizeX(8)),Spacing(SizeX(4)),
  1746.                 TOffset(SizeY(4)-2),BOffset(SizeY(4)),
  1747.                 NeXTFrame, 
  1748.                 FrameTitle(GetString(msgToolBarElements)),
  1749.                 Place(PLACE_ABOVE),
  1750.                 StartMember,
  1751.                   HGroupObject,
  1752.                 StartMember,
  1753.                   TBarObj[TBAR_WIDTHL] = ButtonObject,
  1754.                     VIT_VectorArray,LineArrowLeft,
  1755.                     GA_ToggleSelect,TRUE,
  1756.                     ButtonFrame,
  1757.                   EndObject,
  1758.                   FixWidth(22),FixHeight(SizeY(11)),
  1759.                 EndMember,
  1760.                 StartMember,
  1761.                   TBarObj[TBAR_WIDTHR] = ButtonObject,
  1762.                     VIT_VectorArray,LineArrowRight,
  1763.                     GA_ToggleSelect,TRUE,
  1764.                     ButtonFrame,
  1765.                   EndObject,
  1766.                   FixWidth(22),FixHeight(SizeY(11)),
  1767.                 EndMember,
  1768.                   EndObject,
  1769.                 EndMember,
  1770.                 StartMember,
  1771.                   HGroupObject,
  1772.                 StartMember,
  1773.                   TBarObj[TBAR_MOVEL] = ButtonObject,
  1774.                     VIT_VectorArray,SolidArrowLeft,
  1775.                     GA_ToggleSelect,TRUE,
  1776.                     ButtonFrame,
  1777.                   EndObject,
  1778.                   FixWidth(22),FixHeight(SizeY(11)),
  1779.                 EndMember,
  1780.                 StartMember,
  1781.                   TBarObj[TBAR_MOVER] = ButtonObject,
  1782.                     VIT_VectorArray,SolidArrowRight,
  1783.                     GA_ToggleSelect,TRUE,
  1784.                     ButtonFrame,
  1785.                   EndObject,
  1786.                   FixWidth(22),FixHeight(SizeY(11)),
  1787.                 EndMember,
  1788.                 StartMember,
  1789.                   TBarObj[TBAR_MOVEU] = ButtonObject,
  1790.                     VIT_VectorArray,SolidArrowUp,
  1791.                     GA_ToggleSelect,TRUE,
  1792.                     ButtonFrame,
  1793.                   EndObject,
  1794.                   FixWidth(22),FixHeight(SizeY(11)),
  1795.                 EndMember,
  1796.                 StartMember,
  1797.                   TBarObj[TBAR_MOVED] = ButtonObject,
  1798.                     VIT_VectorArray,SolidArrowDown,
  1799.                     GA_ToggleSelect,TRUE,
  1800.                     ButtonFrame,
  1801.                   EndObject,
  1802.                   FixWidth(22),FixHeight(SizeY(11)),
  1803.                 EndMember,
  1804.                   EndObject,
  1805.                 EndMember,
  1806.                 StartMember,
  1807.                   HGroupObject,
  1808.                 StartMember,
  1809.                   TBarObj[TBAR_KERN] = ButtonObject,
  1810.                     VIT_VectorArray,KernImage,
  1811.                     ButtonFrame,
  1812.                     GA_ToggleSelect,TRUE,
  1813.                   EndObject,
  1814.                   FixWidth(22),FixHeight(SizeY(11)),
  1815.                 EndMember,
  1816.                 StartMember,
  1817.                   TBarObj[TBAR_WIDTH] = ButtonObject,
  1818.                     VIT_VectorArray,WidthImage,
  1819.                     ButtonFrame,
  1820.                     GA_ToggleSelect,TRUE,
  1821.                   EndObject,
  1822.                   FixWidth(22),FixHeight(SizeY(11)),
  1823.                 EndMember,
  1824.                   EndObject,
  1825.                 EndMember,
  1826.                 StartMember,
  1827.                   HGroupObject,
  1828.                 StartMember,
  1829.                   TBarObj[TBAR_ZOOMIN] = ButtonObject,
  1830.                     VIT_VectorArray,ZoomInImage,
  1831.                     ButtonFrame,
  1832.                     GA_ToggleSelect,TRUE,
  1833.                   EndObject,
  1834.                   FixWidth(22),FixHeight(SizeY(11)),
  1835.                 EndMember,
  1836.                 StartMember,
  1837.                   TBarObj[TBAR_ZOOMOUT] = ButtonObject,
  1838.                     VIT_VectorArray,ZoomOutImage,
  1839.                     ButtonFrame,
  1840.                     GA_ToggleSelect,TRUE,
  1841.                   EndObject,
  1842.                   FixWidth(22),FixHeight(SizeY(11)),
  1843.                 EndMember,
  1844.                   EndObject,
  1845.                 EndMember,
  1846.               EndObject,
  1847.               FixMinSize,
  1848.             EndMember,
  1849.             VarSpace(50),
  1850.               EndObject,
  1851.             EndMember,
  1852.             StartMember,
  1853.               HGroupObject,
  1854.             Spacing(SizeX(8)),
  1855.             VarSpace(100),
  1856.             StartMember,
  1857.               VecInt = StringObject,
  1858.                 RidgeFrame,
  1859.                 UScoreLabel(GetString(gadgToolBarHeight),'_'),
  1860.                 STRINGA_LongVal,0,
  1861.                 STRINGA_MaxChars,5,
  1862.                 STRINGA_MinCharsVisible,5,
  1863.                 GA_ID,ID_VECHEIGHT,
  1864.               EndObject,
  1865.             EndMember,
  1866.             StartMember,
  1867.               VGroupObject,
  1868.                 VarSpace(60),
  1869.                 StartMember,
  1870.                   AutoCheck = KeyCheckBox(GetString(gadgAuto),
  1871.                 FALSE,ID_AUTOHEIGHT),
  1872.                 EndMember,
  1873.                 VarSpace(50),
  1874.               EndObject,
  1875.             EndMember,
  1876.             VarSpace(100),
  1877.               EndObject,
  1878.             EndMember,
  1879.             VarSpace(50),
  1880.           EndObject,
  1881.  
  1882.         PageMember,
  1883.           VGroupObject,
  1884.             HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  1885.             ButtonFrame,
  1886.             FRM_Recessed,TRUE,
  1887.             StartMember,
  1888.               VGroupObject,
  1889.             HOffset(SizeX(8)),Spacing(SizeY(2)),
  1890.             TOffset(SizeY(4)-2),BOffset(SizeY(4)),
  1891.             NeXTFrame, 
  1892.             FrameTitle(GetString(msgPixels)),
  1893.             StartMember,
  1894.               HGroupObject,
  1895.                 Spacing(SizeX(8)),
  1896.                 EqualWidth,
  1897.                 StartMember,
  1898.                   PixelXInt = TabKeyInteger(
  1899.                 GetString(gadgPixelWidth),Prefs.PixelX,3,
  1900.                 ID_PIXELWIDTH),
  1901.                   FixMinHeight,
  1902.                 EndMember,
  1903.                 StartMember,
  1904.                   PixelYInt = TabKeyInteger(
  1905.                 GetString(gadgPixelHeight),Prefs.PixelY,3,
  1906.                 ID_PIXELHEIGHT),
  1907.                   FixMinHeight,
  1908.                 EndMember,
  1909.               EndObject,
  1910.             EndMember,
  1911.             StartMember,
  1912.               HGroupObject,
  1913.                 VarSpace(10),
  1914.                 StartMember,
  1915.                   PixelCycle = CycleObject,
  1916.                 UScoreLabel(GetString(gadgPixelBorder),'_'),
  1917.                 ButtonFrame,
  1918.                 CYC_Labels,BorderLabels,
  1919.                 CYC_Popup,TRUE,
  1920.                 GA_ID,ID_PIXELBORDER,
  1921.                   EndObject,
  1922.                 EndMember,
  1923.                 VarSpace(10),
  1924.               EndObject,
  1925.             EndMember,
  1926.               EndObject,
  1927.             EndMember,
  1928.             StartMember,
  1929.               HGroupObject,
  1930.             Spacing(SizeX(8)),
  1931.             StartMember,
  1932.               MaxCheck = KeyCheckBox(GetString(gadgMaxWindow),
  1933.                 FALSE,ID_MAXWIN),
  1934.             EndMember,
  1935.             StartMember,
  1936.               BLineCheck = KeyCheckBox(GetString(gadgShowBLine),
  1937.                 FALSE,ID_SHOWBASELINE),
  1938.             EndMember,
  1939.               EndObject,
  1940.             EndMember,
  1941.           EndObject,
  1942.  
  1943.         PageMember,
  1944.           VGroupObject,
  1945.             HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  1946.             ButtonFrame,
  1947.             FRM_Recessed,TRUE,
  1948.             VarSpace(50),
  1949.             StartMember,
  1950.               HGroupObject,
  1951.             Spacing(SizeX(8)),
  1952.             VarSpace(50),
  1953.             StartMember,
  1954.               SizeCheck = KeyCheckBox(GetString(gadgSizeWin),
  1955.                 FALSE,ID_CHARSIZE),
  1956.             EndMember,
  1957.             StartMember,
  1958.               ShiftCheck = KeyCheckBox(GetString(gadgShift),
  1959.                 FALSE,ID_INVERTSHIFT),
  1960.             EndMember,
  1961.             VarSpace(50),
  1962.               EndObject,
  1963.             EndMember,
  1964.             StartMember,
  1965.               HGroupObject,
  1966.             Spacing(SizeX(8)),
  1967.             StartMember,
  1968.               ChrWCycle = CycleObject,
  1969.                 UScoreLabel(GetString(gadgWidthCycle),'_'),
  1970.                 ButtonFrame,
  1971.                 CYC_Labels,width_labels,
  1972.                 CYC_Popup,TRUE,
  1973.                 GA_ID,ID_CHARWIDE,
  1974.               EndObject,
  1975.             EndMember,
  1976.             StartMember,
  1977.               ChrHInt = KeyInteger(GetString(gadgSelWinHeight),
  1978.                 0,3,ID_CHARHIGH),
  1979.             EndMember,
  1980.               EndObject,
  1981.             EndMember,
  1982.             StartMember,
  1983.               HGroupObject,
  1984.             FixMinHeight,
  1985.             EqualHeight,
  1986.             StartMember,
  1987.               ChrFontInfo = InfoObject,
  1988.                 UScoreLabel(GetString(gadgSelWinFont),'_'),
  1989.                 ButtonFrame,
  1990.                 FRM_Flags,FRF_RECESSED,
  1991.                 INFO_MinLines,1,
  1992.                 INFO_HorizOffset,6,
  1993.                 INFO_VertOffset,4,
  1994.               EndObject,
  1995.             EndMember,
  1996.             StartMember,
  1997.               ChrFontButton = ButtonObject,
  1998.                 PopUp,
  1999.                 ButtonFrame,
  2000.                 GA_ID,ID_CHOOSEFIXFONT,
  2001.               EndObject,
  2002.               FixMinWidth,
  2003.             EndMember,
  2004.               EndObject,
  2005.             EndMember,
  2006.             VarSpace(50),
  2007.           EndObject,
  2008.  
  2009.         PageMember,
  2010.           VGroupObject,
  2011.             HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  2012.             ButtonFrame,
  2013.             FRM_Recessed,TRUE,
  2014.             VarSpace(50),
  2015.             StartMember,
  2016.               HGroupObject,
  2017.             HOffset(SizeX(8)),Spacing(SizeX(4)),
  2018.             TOffset(SizeY(4)-2),BOffset(SizeY(4)),
  2019.             NeXTFrame, 
  2020.             FrameTitle(GetString(msgSavePrefsTo)),
  2021.             Place(PLACE_ABOVE),
  2022.             StartMember,
  2023.               SaveCycle = CycleObject,
  2024.                 ButtonFrame,
  2025.                 CYC_Labels,SaveLabels,
  2026.                 CYC_Active,Prefs.SaveTo,
  2027.                 CYC_Popup,TRUE,
  2028.                 GA_ID,ID_SAVETO,
  2029.               EndObject,
  2030.             EndMember,
  2031.               EndObject,
  2032.             EndMember,
  2033.             StartMember,
  2034.               HGroupObject,
  2035.             VarSpace(50),
  2036.             StartMember,
  2037.               QuitCheck = KeyCheckBox(GetString(gadgQuit),FALSE,
  2038.                 ID_CONFIRMQUIT),
  2039.             EndMember,
  2040.             VarSpace(50),
  2041.               EndObject,
  2042.             EndMember,
  2043.             VarSpace(50),
  2044.           EndObject,
  2045.  
  2046.           EndObject,
  2047.         EndMember,
  2048.         StartMember,
  2049.           HGroupObject,
  2050.         Spacing(SizeX(8)),
  2051.         EqualWidth,
  2052.         StartMember,
  2053.           save = KeyButton(GetString(gadgPrefsSave),ID_ACCEPT),
  2054.         EndMember,
  2055.         StartMember,
  2056.           use = KeyButton(GetString(gadgPrefsUse),ID_USE),
  2057.         EndMember,
  2058.             StartMember,
  2059.           cancel = KeyButton(GetString(gadgCancel),ID_CANCEL),
  2060.         EndMember,
  2061.           EndObject,
  2062.           FixMinHeight,
  2063.         EndMember,
  2064.       EndObject,
  2065.     EndObject;
  2066.       if (PrefsWndObj == NULL) ErrorCode(NEWWINDOW);
  2067.  
  2068.       SetLabelKey(PrefsWndObj,save,gadgPrefsSave);
  2069.       SetLabelKey(PrefsWndObj,use,gadgPrefsUse);
  2070.       SetLabelKey(PrefsWndObj,cancel,gadgCancel);
  2071.  
  2072.       SetLabelKey(PrefsWndObj,CustButton,gadgCustomScr);
  2073.       SetLabelKey(PrefsWndObj,ModeButton,gadgMode);
  2074.       SetLabelKey(PrefsWndObj,FontButton,gadgScreenFont);
  2075.       SetLabelKey(PrefsWndObj,PubStr,gadgPubScreen);
  2076.  
  2077.       SetLabelKey(PrefsWndObj,VecInt,gadgToolBarHeight);
  2078.       SetLabelKey(PrefsWndObj,AutoCheck,gadgAuto);
  2079.  
  2080.       SetLabelKey(PrefsWndObj,PixelXInt,gadgPixelWidth);
  2081.       SetLabelKey(PrefsWndObj,PixelYInt,gadgPixelHeight);
  2082.       SetLabelKey(PrefsWndObj,PixelCycle,gadgPixelBorder);
  2083.       SetLabelKey(PrefsWndObj,MaxCheck,gadgMaxWindow);
  2084.       SetLabelKey(PrefsWndObj,BLineCheck,gadgShowBLine);
  2085.  
  2086.       SetLabelKey(PrefsWndObj,SizeCheck,gadgSizeWin);
  2087.       SetLabelKey(PrefsWndObj,ShiftCheck,gadgShift);
  2088.       SetLabelKey(PrefsWndObj,ChrWCycle,gadgWidthCycle);
  2089.       SetLabelKey(PrefsWndObj,ChrHInt,gadgSelWinHeight);
  2090.       SetLabelKey(PrefsWndObj,ChrFontButton,gadgSelWinFont);
  2091.  
  2092.       GadgetKey(PrefsWndObj,SaveCycle,"v");
  2093.       SetLabelKey(PrefsWndObj,QuitCheck,gadgQuit);
  2094.       GadgetKey(PrefsWndObj,select,"\\");
  2095.  
  2096.       DoMethod(PrefsWndObj,WM_TABCYCLE_ORDER,PixelXInt,PixelYInt,NULL);
  2097.       AddMap(select,page,map);
  2098.     }
  2099.  
  2100.     SetAttrs(CustButton,GA_Selected,CustomScreen,TAG_DONE);
  2101.     SetAttrs(ModeButton,
  2102.       GA_Disabled,(CustomScreen == TRUE) ? FALSE : TRUE,TAG_DONE);
  2103.     SetAttrs(FontButton,
  2104.       GA_Disabled,(CustomScreen == TRUE) ? FALSE : TRUE,TAG_DONE);
  2105.     PrefScrModeID = Prefs.ScrModeID;
  2106.     PrefScrDepth = Prefs.ScrDepth;
  2107.     GetDisplayInfoData(NULL,&ModeIDName,sizeof(struct NameInfo),
  2108.       DTAG_NAME,PrefScrModeID);
  2109.     SetAttrs(ModeInfo,INFO_TextFormat,ModeIDName.Name,TAG_DONE);
  2110.     strcpy(PrefScrFontName,Prefs.ScrFontName);
  2111.     PrefScrFontHeight = Prefs.ScrFontHeight;
  2112.     WriteFont(PrefScrBuffer,Prefs.ScrFontName,Prefs.ScrFontHeight);
  2113.     SetAttrs(FontInfo,INFO_TextFormat,PrefScrBuffer,TAG_DONE);
  2114.     strcpy(PrefThisPubName,Prefs.ThisPubName);
  2115.     strcpy(PrefDefPubName,Prefs.DefPubName);
  2116.     SetAttrs(PubStr,STRINGA_TextVal,GetPubName(CustomScreen),TAG_DONE);
  2117.  
  2118.     for (i = 0; i < MAX_TBAR; i++)
  2119.       SetAttrs(TBarObj[i],GA_Selected,Prefs.ToolBar & (1 << i),TAG_DONE);
  2120.     SetAttrs(AutoCheck,GA_Selected,AutoHeight,TAG_DONE);
  2121.     SetAttrs(VecInt,
  2122.       STRINGA_LongVal,Prefs.VecHeight,
  2123.       GA_Disabled,AutoHeight,TAG_DONE);
  2124.  
  2125.     SetAttrs(PixelXInt,STRINGA_LongVal,Prefs.PixelX,TAG_DONE);
  2126.     SetAttrs(PixelYInt,STRINGA_LongVal,Prefs.PixelY,TAG_DONE);
  2127.     SetAttrs(PixelCycle,CYC_Active,PixelBorder,TAG_DONE);
  2128.     SetAttrs(MaxCheck,GA_Selected,MaxWindow,TAG_DONE);
  2129.     SetAttrs(BLineCheck,GA_Selected,ShowBLine,TAG_DONE);
  2130.  
  2131.     SetAttrs(SizeCheck,GA_Selected,Prefs.CharSize,TAG_DONE);
  2132.     SetAttrs(ShiftCheck,GA_Selected,InvertShift,TAG_DONE);
  2133.     SetAttrs(ChrWCycle,CYC_Active,Prefs.CharWidth,TAG_DONE);
  2134.     SetAttrs(ChrHInt,STRINGA_LongVal,Prefs.CharHeight,TAG_DONE);
  2135.     strcpy(PrefFixFontName,Prefs.FixedFontName);
  2136.     PrefFixFontHeight = Prefs.FixedFontHeight;
  2137.     WriteFont(PrefFixBuffer,Prefs.FixedFontName,Prefs.FixedFontHeight);
  2138.     SetAttrs(ChrFontInfo,INFO_TextFormat,PrefFixBuffer,TAG_DONE);
  2139.  
  2140.     SetAttrs(SaveCycle,CYC_Active,Prefs.SaveTo,TAG_DONE);
  2141.     SetAttrs(QuitCheck,GA_Selected,ConfirmQuit,TAG_DONE);
  2142.     if ((PrefsWnd = WindowOpen(PrefsWndObj)) == NULL) ErrorCode(OPENWINDOW);
  2143.   }
  2144. }
  2145.  
  2146. void ClosePrefsWnd(BOOL obj)
  2147. {
  2148.   ClrWindowClose(&PrefsWndObj,&PrefsWnd);
  2149.   if (obj) ClrDisposeObject(&PrefsWndObj);
  2150. }
  2151.  
  2152. void OpenAssignWnd(void)
  2153. {
  2154. Object *assign, *assignadd, *cancel;
  2155.  
  2156.   if (AssignWnd)
  2157.   {
  2158.     WindowToFront(AssignWnd);
  2159.     ActivateWindow(AssignWnd);
  2160.   }
  2161.   else
  2162.   {
  2163.     if (AssignWndObj == NULL)
  2164.     {
  2165.       SetupMenus(Menus);
  2166.       AssignWndObj = WindowObject,
  2167.     WINDOW_Screen,Screen,
  2168.     WINDOW_SharedPort,WndMsgPort,
  2169.     WINDOW_MenuStrip,Menus,
  2170.     WINDOW_Title,GetString(msgFontDirTitle),
  2171.     WINDOW_HelpFile,NAME".guide",
  2172.     WINDOW_HelpNode,"dir",
  2173.     WINDOW_ScaleWidth,26,
  2174.     WINDOW_SmartRefresh,TRUE,
  2175.     WINDOW_SizeGadget,FALSE,
  2176.     WINDOW_CloseOnEsc,TRUE,
  2177.     WINDOW_MasterGroup,
  2178.       VGroupObject,
  2179.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(4)),
  2180.         GROUP_BackFill,SHINE_RASTER,
  2181.         StartMember,
  2182.           HGroupObject,
  2183.         HOffset(SizeX(8)),VOffset(SizeY(4)),
  2184.         EqualHeight,
  2185.         ButtonFrame,
  2186.         FRM_Recessed,TRUE,
  2187.         StartMember,
  2188.           FontDirStr = StringObject,
  2189.             RidgeFrame,
  2190.             STRINGA_TextVal,FontPath,
  2191.             STRINGA_MaxChars,255,
  2192.             GA_ID,ID_ASSIGNSTR,
  2193.           EndObject,
  2194.         EndMember,
  2195.         StartMember,
  2196.           ButtonObject,
  2197.             GetPath,
  2198.             ButtonFrame,
  2199.             GA_ID,ID_ASSIGNPATH,
  2200.           EndObject,
  2201.           FixMinWidth,
  2202.         EndMember,
  2203.           EndObject,
  2204.         EndMember,
  2205.         StartMember,
  2206.           HGroupObject,
  2207.         Spacing(SizeX(8)),
  2208.         StartMember,
  2209.           assign = KeyButton(GetString(gadgAssign),ID_ASSIGN),
  2210.         EndMember,
  2211.             StartMember,
  2212.           assignadd = KeyButton(GetString(gadgAssignAdd),
  2213.             ID_ASSIGNADD),
  2214.         EndMember,
  2215.             StartMember,
  2216.           cancel = KeyButton(GetString(gadgCancel),ID_CANCEL),
  2217.         EndMember,
  2218.           EndObject,
  2219.           FixMinHeight,
  2220.         EndMember,
  2221.       EndObject,
  2222.     EndObject;
  2223.       if (AssignWndObj == NULL) ErrorCode(NEWWINDOW);
  2224.       SetLabelKey(AssignWndObj,assign,gadgAssign);
  2225.       SetLabelKey(AssignWndObj,assignadd,gadgAssignAdd);
  2226.       SetLabelKey(AssignWndObj,cancel,gadgCancel);
  2227.  
  2228.       DirReqObj = FileReqObject,
  2229.     ASLFR_TitleText,GetString(msgFontDirTitle),
  2230.     ASLFR_DrawersOnly,TRUE,
  2231.     ASLFR_Window,FontWnd,
  2232.       EndObject;
  2233.       if (DirReqObj == NULL) ErrorCode(NEWFILE);
  2234.     }
  2235.  
  2236.     SetAttrs(FontDirStr,STRINGA_TextVal,FontPath,TAG_DONE);
  2237.     if ((AssignWnd = WindowOpen(AssignWndObj)) == NULL)
  2238.       ErrorCode(OPENWINDOW);
  2239.   }
  2240. }
  2241.  
  2242. void CloseAssignWnd(BOOL obj)
  2243. {
  2244.   ClrWindowClose(&AssignWndObj,&AssignWnd);
  2245.   if (obj) ClrDisposeObject(&AssignWndObj);
  2246. }
  2247.  
  2248. void OpenWidthWnd(struct CharNode *node)
  2249. {
  2250. Object *accept, *cancel;
  2251. static ULONG lmap[] = { PGA_Top,INDIC_Level,TAG_END };
  2252. static ULONG rmap[] = { SCRL_Right,INDIC_Level,TAG_END };
  2253.  
  2254.   if (node->chln_Number < 256)
  2255.     sprintf(WidthTitle,GetString(msgWidthTitle),
  2256.       node->chln_Number,node->chln_Character->chr_Width);
  2257.   else
  2258.     sprintf(WidthTitle,GetString(msgWidthTitleBlank),
  2259.       node->chln_Character->chr_Width);
  2260.   WidthNode = node;
  2261.   WidthChar = node->chln_Character;
  2262.  
  2263.   if (WidthWnd)
  2264.   {
  2265.     SetGadgetAttrs(ChrWidthScroll,WidthWnd,NULL,
  2266.       PGA_Top,0,
  2267.       PGA_Total,1,
  2268.       PGA_Visible,1,TAG_DONE);
  2269.     SetGadgetAttrs(ChrWidthInt,WidthWnd,NULL,
  2270.       STRINGA_LongVal,WidthChar->chr_Width,TAG_DONE);
  2271.     SetAttrs(WidthWndObj,WINDOW_Title,WidthTitle,TAG_DONE);
  2272.     WindowToFront(WidthWnd);
  2273.     ActivateWindow(WidthWnd);
  2274.   }
  2275.   else
  2276.   {
  2277.     if (WidthWndObj == NULL)
  2278.     {
  2279.       SetupMenus(CharMenus);
  2280.       WidthWndObj = WindowObject,
  2281.     WINDOW_Screen,Screen,
  2282.     WINDOW_SharedPort,WndMsgPort,
  2283.     WINDOW_MenuStrip,CharMenus,
  2284.     WINDOW_HelpFile,NAME".guide",
  2285.     WINDOW_HelpNode,"width",
  2286.     WINDOW_SmartRefresh,TRUE,
  2287.     WINDOW_SizeGadget,FALSE,
  2288.     WINDOW_CloseOnEsc,TRUE,
  2289.     WINDOW_MasterGroup,
  2290.       VGroupObject,
  2291.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(4)),
  2292.         GROUP_BackFill,SHINE_RASTER,
  2293.         StartMember,
  2294.           VGroupObject,
  2295.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  2296.         ButtonFrame,
  2297.         FRM_Recessed,TRUE,
  2298.         StartMember,
  2299.           ChrWidthInt = KeyInteger(GetString(gadgNewWidth),
  2300.             WidthChar->chr_Width,5,ID_CHARWIDTH),
  2301.         EndMember,
  2302.         StartMember,
  2303.           HGroupObject,
  2304.             Spacing(SizeX(8)),
  2305.             StartMember,
  2306.               LeftInd = IndicatorObject,
  2307.             INDIC_Min,0,
  2308.             INDIC_Max,999,
  2309.             INDIC_FormatString,GetString(msgLeftOffset),
  2310.               EndObject,
  2311.             EndMember,
  2312.             StartMember,
  2313.               RightInd = IndicatorObject,
  2314.             INDIC_Min,0,
  2315.             INDIC_Max,999,
  2316.             INDIC_FormatString,GetString(msgRightOffset),
  2317.               EndObject,
  2318.             EndMember,
  2319.           EndObject,
  2320.         EndMember,
  2321.         StartMember,
  2322.           ChrWidthScroll = NewObject(SlideClass,NULL,
  2323.             PGA_Freedom,FREEHORIZ,
  2324.             PGA_Arrows,FALSE,
  2325.             GA_ID,ID_WIDTHPOS,
  2326.           EndObject,
  2327.         EndMember,
  2328.           EndObject,
  2329.         EndMember,
  2330.         StartMember,
  2331.           HGroupObject,
  2332.         Spacing(SizeX(8)),
  2333.         StartMember,
  2334.           accept = KeyButton(GetString(gadgAccept),ID_ACCEPT),
  2335.         EndMember,
  2336.             StartMember,
  2337.           cancel = KeyButton(GetString(gadgCancel),ID_CANCEL),
  2338.         EndMember,
  2339.           EndObject,
  2340.           FixMinHeight,
  2341.         EndMember,
  2342.       EndObject,
  2343.     EndObject;
  2344.       if (WidthWndObj == NULL) ErrorCode(NEWWINDOW);
  2345.       SetLabelKey(WidthWndObj,accept,gadgAccept);
  2346.       SetLabelKey(WidthWndObj,cancel,gadgCancel);
  2347.       SetLabelKey(WidthWndObj,ChrWidthInt,gadgNewWidth);
  2348.       AddMap(ChrWidthScroll,LeftInd,lmap);
  2349.       AddMap(ChrWidthScroll,RightInd,rmap);
  2350.     }
  2351.  
  2352.     SetAttrs(ChrWidthScroll,
  2353.       PGA_Top,0,
  2354.       PGA_Total,1,
  2355.       PGA_Visible,1,TAG_DONE);
  2356.     SetAttrs(ChrWidthInt,STRINGA_LongVal,WidthChar->chr_Width,TAG_DONE);
  2357.     SetAttrs(WidthWndObj,WINDOW_Title,WidthTitle,TAG_DONE);
  2358.     if ((WidthWnd = WindowOpen(WidthWndObj)) == NULL) ErrorCode(OPENWINDOW);
  2359.   }
  2360. }
  2361.  
  2362. void CloseWidthWnd(BOOL obj)
  2363. {
  2364.   ClrWindowClose(&WidthWndObj,&WidthWnd);
  2365.   if (obj) ClrDisposeObject(&WidthWndObj);
  2366.   WidthNode = NULL; WidthChar = NULL;
  2367. }
  2368.  
  2369. void OpenKernWnd(struct CharNode *node)
  2370. {
  2371. Object *accept, *cancel;
  2372.  
  2373.   if (node->chln_Number < 256)
  2374.     sprintf(KernTitle,GetString(msgKernTitle),node->chln_Number);
  2375.   else
  2376.     sprintf(KernTitle,GetString(msgKernTitleBlank));
  2377.   KernNode = node;
  2378.   KernChar = node->chln_Character;
  2379.  
  2380.   if (KernWnd)
  2381.   {
  2382.     SetAttrs(KernWndObj,WINDOW_Title,KernTitle,TAG_DONE);
  2383.     SetGadgetAttrs(SpaceObj,KernWnd,NULL,
  2384.       STRINGA_LongVal,SpaceTable[node->chln_Number],TAG_DONE);
  2385.     SetGadgetAttrs(KernObj,KernWnd,NULL,
  2386.       STRINGA_LongVal,KernTable[node->chln_Number],TAG_DONE);
  2387.     WindowToFront(KernWnd);
  2388.     ActivateWindow(KernWnd);
  2389.   }
  2390.   else
  2391.   {
  2392.     if (KernWndObj == NULL)
  2393.     {
  2394.       SetupMenus(CharMenus);
  2395.       KernWndObj = WindowObject,
  2396.     WINDOW_Screen,Screen,
  2397.     WINDOW_SharedPort,WndMsgPort,
  2398.     WINDOW_MenuStrip,CharMenus,
  2399.     WINDOW_HelpFile,NAME".guide",
  2400.     WINDOW_HelpNode,"kern",
  2401.     WINDOW_ScaleWidth,11,
  2402.     WINDOW_SmartRefresh,TRUE,
  2403.     WINDOW_SizeGadget,FALSE,
  2404.     WINDOW_CloseOnEsc,TRUE,
  2405.     WINDOW_MasterGroup,
  2406.       VGroupObject,
  2407.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(4)),
  2408.         GROUP_BackFill,SHINE_RASTER,
  2409.         StartMember,
  2410.           VGroupObject,
  2411.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  2412.         ButtonFrame,
  2413.         FRM_Recessed,TRUE,
  2414.         StartMember,
  2415.           SpaceObj = TabKeyInteger(GetString(gadgSpacing),0,5,
  2416.             ID_SPACE),
  2417.         EndMember,
  2418.         StartMember,
  2419.           KernObj = TabKeyInteger(GetString(gadgKerning),0,5,
  2420.             ID_KERN),
  2421.         EndMember,
  2422.           EndObject,
  2423.         EndMember,
  2424.         StartMember,
  2425.           HGroupObject,
  2426.         Spacing(SizeX(8)),
  2427.         StartMember,
  2428.           accept = KeyButton(GetString(gadgAccept),ID_ACCEPT),
  2429.         EndMember,
  2430.             StartMember,
  2431.           cancel = KeyButton(GetString(gadgCancel),ID_CANCEL),
  2432.         EndMember,
  2433.           EndObject,
  2434.           FixMinHeight,
  2435.         EndMember,
  2436.       EndObject,
  2437.     EndObject;
  2438.       if (KernWndObj == NULL) ErrorCode(NEWWINDOW);
  2439.       SetLabelKey(KernWndObj,accept,gadgAccept);
  2440.       SetLabelKey(KernWndObj,cancel,gadgCancel);
  2441.       SetLabelKey(KernWndObj,SpaceObj,gadgSpacing);
  2442.       SetLabelKey(KernWndObj,KernObj,gadgKerning);
  2443.       DoMethod(KernWndObj,WM_TABCYCLE_ORDER,SpaceObj,KernObj,NULL);
  2444.     }
  2445.  
  2446.     SetAttrs(KernWndObj,WINDOW_Title,KernTitle,TAG_DONE);
  2447.     SetAttrs(SpaceObj,
  2448.       STRINGA_LongVal,SpaceTable[node->chln_Number],TAG_DONE);
  2449.     SetAttrs(KernObj,STRINGA_LongVal,KernTable[node->chln_Number],TAG_DONE);
  2450.     if ((KernWnd = WindowOpen(KernWndObj)) == NULL) ErrorCode(OPENWINDOW);
  2451.   }
  2452. }
  2453.  
  2454. void CloseKernWnd(BOOL obj)
  2455. {
  2456.   ClrWindowClose(&KernWndObj,&KernWnd);
  2457.   if (obj) ClrDisposeObject(&KernWndObj);
  2458.   KernNode = NULL; KernChar = NULL;
  2459. }
  2460.  
  2461. void OpenSaveWnd(void)
  2462. {
  2463. Object *save, *cancel;
  2464. ULONG satan = 666;
  2465.  
  2466.   if (SaveWnd)
  2467.   {
  2468.     WindowToFront(SaveWnd);
  2469.     ActivateWindow(SaveWnd);
  2470.   }
  2471.   else
  2472.   {
  2473.     if (SaveWndObj == NULL)
  2474.     {
  2475.       SaveWndObj = WindowObject,
  2476.     WINDOW_Screen,Screen,
  2477.     WINDOW_SharedPort,WndMsgPort,
  2478.     WINDOW_Title,GetString(msgSaveTitle),
  2479.     WINDOW_HelpFile,NAME".guide",
  2480.     WINDOW_HelpNode,"save",
  2481.     WINDOW_SmartRefresh,TRUE,
  2482.     WINDOW_SizeGadget,FALSE,
  2483.     WINDOW_RMBTrap,TRUE,
  2484.     WINDOW_CloseOnEsc,TRUE,
  2485.     WINDOW_MasterGroup,
  2486.       VGroupObject,
  2487.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(4)),
  2488.         GROUP_BackFill,SHINE_RASTER,
  2489.         StartMember,
  2490.           VGroupObject,
  2491.         HOffset(SizeX(8)),VOffset(SizeY(4)),Spacing(SizeY(2)),
  2492.         ButtonFrame,
  2493.         FRM_Recessed,TRUE,
  2494.         StartMember,
  2495.           HGroupObject,
  2496.             VarSpace(0),
  2497.             StartMember,
  2498.               SaveDirStr = StringObject,
  2499.             RidgeFrame,
  2500.             UScoreLabel(GetString(gadgFontDir),'_'),
  2501.             STRINGA_MaxChars,255,
  2502.             GA_TabCycle,TRUE,
  2503.             GA_ID,ID_SAVEDIR,
  2504.               EndObject,
  2505.             EndMember,
  2506.             StartMember,
  2507.               ButtonObject,
  2508.             GetPath,
  2509.             ButtonFrame,
  2510.             GA_ID,ID_GETSAVEDIR,
  2511.               EndObject,
  2512.               FixMinWidth,
  2513.             EndMember,
  2514.           EndObject,
  2515.           NoAlign,
  2516.         EndMember,
  2517.         StartMember,
  2518.           HGroupObject,
  2519.             Spacing(SizeX(8)),
  2520.             StartMember,
  2521.               FontNameStr = StringObject,
  2522.             RidgeFrame,
  2523.             UScoreLabel(GetString(gadgFontName),'_'),
  2524.             STRINGA_MaxChars,255,
  2525.             GA_TabCycle,TRUE,
  2526.             GA_ID,ID_FONTNAME,
  2527.               EndObject,
  2528.             EndMember,
  2529.             StartMember,
  2530.               SizeInfo = InfoObject,
  2531.             ButtonFrame,
  2532.             FRM_Flags,FRF_RECESSED,
  2533.             Label(GetString(msgSize)),
  2534.             INFO_TextFormat,"\33c%ld",
  2535.             INFO_Args,&satan,
  2536.             INFO_MinLines,1,
  2537.             INFO_HorizOffset,6,
  2538.             INFO_VertOffset,3,
  2539.             INFO_FixTextWidth,TRUE,
  2540.               EndObject,
  2541.               Weight(10),
  2542.             EndMember,
  2543.           EndObject,
  2544.         EndMember,
  2545.         StartMember,
  2546.           HGroupObject,
  2547.             Spacing(SizeX(8)),
  2548.             StartMember,
  2549.               FirstNum = StringObject,
  2550.             RidgeFrame,
  2551.             UScoreLabel(GetString(gadgFirst),'_'),
  2552.             STRINGA_LongVal,0,
  2553.             STRINGA_MaxChars,3,
  2554.             STRINGA_MinCharsVisible,4,
  2555.             GA_TabCycle,TRUE,
  2556.             GA_ID,ID_FIRST,
  2557.               EndObject,
  2558.             EndMember,
  2559.             StartMember,
  2560.               LastNum = StringObject,
  2561.             RidgeFrame,
  2562.             UScoreLabel(GetString(gadgLast),'_'),
  2563.             STRINGA_LongVal,0,
  2564.             STRINGA_MaxChars,3,
  2565.             STRINGA_MinCharsVisible,4,
  2566.             GA_TabCycle,TRUE,
  2567.             GA_ID,ID_LAST,
  2568.               EndObject,
  2569.             EndMember,
  2570.             StartMember,
  2571.               VGroupObject,
  2572.             VarSpace(60),
  2573.             StartMember,
  2574.               TableCheck = KeyCheckBox(GetString(gadgKernInfo),
  2575.                 FALSE,ID_KERNTABLE),
  2576.             EndMember,
  2577.             VarSpace(50),
  2578.               EndObject,
  2579.             EndMember,
  2580.           EndObject,
  2581.         EndMember,
  2582.           EndObject,
  2583.         EndMember,
  2584.         StartMember,
  2585.           HGroupObject,
  2586.         Spacing(SizeX(8)),
  2587.         StartMember,
  2588.           save = KeyButton(GetString(gadgSave),ID_ACCEPT),
  2589.         EndMember,
  2590.             StartMember,
  2591.           cancel = KeyButton(GetString(gadgCancel),ID_CANCEL),
  2592.         EndMember,
  2593.           EndObject,
  2594.           FixMinHeight,
  2595.         EndMember,
  2596.       EndObject,
  2597.     EndObject;
  2598.       if (SaveWndObj == NULL) ErrorCode(NEWWINDOW);
  2599.       SetLabelKey(SaveWndObj,save,gadgSave);
  2600.       SetLabelKey(SaveWndObj,cancel,gadgCancel);
  2601.       SetLabelKey(SaveWndObj,SaveDirStr,gadgFontDir);
  2602.       SetLabelKey(SaveWndObj,FontNameStr,gadgFontName);
  2603.       SetLabelKey(SaveWndObj,FirstNum,gadgFirst);
  2604.       SetLabelKey(SaveWndObj,LastNum,gadgLast);
  2605.       SetLabelKey(SaveWndObj,TableCheck,gadgKernInfo);
  2606.       DoMethod(SaveWndObj,WM_TABCYCLE_ORDER,
  2607.     SaveDirStr,FontNameStr,FirstNum,LastNum,NULL);
  2608.  
  2609.       SaveReqObj = FileReqObject,
  2610.     ASLFR_TitleText,GetString(msgFontDirTitle),
  2611.     ASLFR_DrawersOnly,TRUE,
  2612.       EndObject;
  2613.       if (SaveReqObj == NULL) ErrorCode(NEWFILE);
  2614.     }
  2615.  
  2616.     SleepWindows();
  2617.     SetAttrs(SaveDirStr,STRINGA_TextVal,SavePath,TAG_DONE);
  2618.     SetAttrs(FontNameStr,STRINGA_TextVal,FontName,TAG_DONE);
  2619.     SetAttrs(FirstNum,STRINGA_LongVal,FirstChar,TAG_DONE);
  2620.     SetAttrs(LastNum,STRINGA_LongVal,LastChar,TAG_DONE);
  2621.     SetAttrs(SizeInfo,INFO_Args,&Height,TAG_DONE);
  2622.     SetAttrs(TableCheck,
  2623.       GA_Disabled,Proportional == TRUE,
  2624.       GA_Selected,(Proportional == TRUE) || (UseTable == TRUE),TAG_DONE);
  2625.     if ((SaveWnd = WindowOpen(SaveWndObj)) == NULL) ErrorCode(OPENWINDOW);
  2626.   }
  2627. }
  2628.  
  2629. void CloseSaveWnd(BOOL obj)
  2630. {
  2631.   WakeWindows();
  2632.   ClrWindowClose(&SaveWndObj,&SaveWnd);
  2633.   if (obj) ClrDisposeObject(&SaveWndObj);
  2634. }
  2635.  
  2636. void OpenAboutWnd(void)
  2637. {
  2638. static struct EasyStruct req =
  2639.   { sizeof(struct EasyStruct),0,NAME,
  2640.     NAME" "VERSION" © 1995 David Kinder\n\n"
  2641.     "bgui.library © Jan van den Baard\n"
  2642.     "textfield.gadget © Mark Thomas\n\n"
  2643.     "%s: %ld Kb\n%s: %ld Kb",NULL };
  2644.  
  2645.   SleepWindows();
  2646.   req.es_GadgetFormat = GetString(msgContinue);
  2647.   EasyRequest(FontWnd,&req,NULL,
  2648.     GetString(msgFreeChip),AvailMem(MEMF_CHIP)/1024,
  2649.     GetString(msgFreeFast),AvailMem(MEMF_FAST)/1024);
  2650.   WakeWindows();
  2651. }
  2652.  
  2653. void PutPositive(struct Window *wnd, char *name, LONG value, LONG min,
  2654.   LONG *dest)
  2655. {
  2656.   if (value > min)
  2657.   {
  2658.     *dest = value;
  2659.   }
  2660.   else
  2661.   {
  2662.     ShowReq(GetString(msgPutPositive),GetString(msgContinue),name,min);
  2663.     FlagError = TRUE;
  2664.   }
  2665. }
  2666.  
  2667. void NewHeights(void)
  2668. {
  2669. struct Character *chr;
  2670. ULONG i;
  2671. UBYTE *new_char;
  2672.  
  2673.   for (i = 0; i < 257; i++)
  2674.   {
  2675.     chr = CharBuffer+i;
  2676.     if (chr->chr_Data)
  2677.     {
  2678.       if ((new_char = AllocVec(chr->chr_Width*Height,MEMF_CLEAR)) == NULL)
  2679.     ErrorCode(ALLOCVEC);
  2680.       CopyMem(chr->chr_Data,new_char,
  2681.     MIN(chr->chr_Height,Height)*chr->chr_Width);
  2682.       FreeVec(chr->chr_Data);
  2683.       chr->chr_Data = new_char;
  2684.     }
  2685.     chr->chr_Height = Height;
  2686.   }
  2687.   sprintf(WinTitle,"%s/%ld",FontName,Height);
  2688.   SetAttrs(FontWndObj,WINDOW_Title,WinTitle,TAG_DONE);
  2689. }
  2690.  
  2691. void NewWidths(void)
  2692. {
  2693. struct Character *chr;
  2694. ULONG i;
  2695.  
  2696.   for (i = 0; i < 257; i++)
  2697.   {
  2698.     chr = CharBuffer+i;
  2699.     if (chr->chr_Data) ChangeCharWidth(chr,Width,0,0);
  2700.     chr->chr_Width = Width;
  2701.   }
  2702. }
  2703.  
  2704. void ChangeCharWidth(struct Character *chr, ULONG width, ULONG newoffset,
  2705.   ULONG oldoffset)
  2706. {
  2707. ULONG j;
  2708. UBYTE *data = NULL;
  2709.  
  2710.   if ((width > 0) && (chr->chr_Data))
  2711.   {
  2712.     if ((data = AllocVec(width*Height,MEMF_CLEAR)) == NULL)
  2713.       ErrorCode(ALLOCVEC);
  2714.     for (j = 0; j < Height; j++)
  2715.       CopyMem(chr->chr_Data+(j*chr->chr_Width)+oldoffset,
  2716.       data+(j*width)+newoffset,MIN(chr->chr_Width,width));
  2717.   }
  2718.   if (chr->chr_Data) FreeVec(chr->chr_Data);
  2719.   if (Reversed == FALSE)
  2720.     SpaceTable[chr-CharBuffer] += (width-chr->chr_Width);
  2721.   chr->chr_Data = data;
  2722.   chr->chr_Width = width;
  2723.   CheckWidthKern(chr);
  2724. }
  2725.  
  2726. void CheckWidthKern(struct Character *chr)
  2727. {
  2728.   if (chr == WidthChar)
  2729.   {
  2730.     if (WidthNode->chln_Number < 256)
  2731.       sprintf(WidthTitle,GetString(msgWidthTitle),
  2732.         WidthNode->chln_Number,WidthChar->chr_Width);
  2733.     else
  2734.       sprintf(WidthTitle,GetString(msgWidthTitleBlank),
  2735.     WidthChar->chr_Width);
  2736.     SetGadgetAttrs(ChrWidthScroll,WidthWnd,NULL,
  2737.       PGA_Top,0,
  2738.       PGA_Total,1,
  2739.       PGA_Visible,1,TAG_DONE);
  2740.     SetGadgetAttrs(ChrWidthInt,WidthWnd,NULL,
  2741.       STRINGA_LongVal,WidthChar->chr_Width,TAG_DONE);
  2742.     SetAttrs(WidthWndObj,WINDOW_Title,WidthTitle,TAG_DONE);
  2743.   }
  2744.   if (chr == KernChar)
  2745.     SetGadgetAttrs(SpaceObj,KernWnd,NULL,
  2746.       STRINGA_LongVal,SpaceTable[KernNode->chln_Number],TAG_DONE);
  2747. }
  2748.  
  2749. void SavePrefs(char *filename)
  2750. {
  2751. BPTR file;
  2752.  
  2753.   SleepWindows();
  2754.   Prefs.Flags = 0;
  2755.   if (NewCustom) Prefs.Flags |= PREFS_CUSTOMSCREEN;
  2756.   if (MaxWindow) Prefs.Flags |= PREFS_MAXWINDOW;
  2757.   if (ConfirmQuit) Prefs.Flags |= PREFS_CONFIRMQUIT;
  2758.   if (ShowBLine) Prefs.Flags |= PREFS_SHOWBASELINE;
  2759.   if (AutoHeight) Prefs.Flags |= PREFS_AUTOTBARHEIGHT;
  2760.   if (InvertShift) Prefs.Flags |= PREFS_INVERTSHIFT;
  2761.   switch (PixelBorder)
  2762.   {
  2763.     case 1:
  2764.       Prefs.Flags |= PREFS_PIXELBORDER;
  2765.       break;
  2766.     case 2:
  2767.       Prefs.Flags |= PREFS_PIXELGRID;
  2768.       break;
  2769.   }
  2770.   if (file = Open(filename,MODE_NEWFILE))
  2771.   {
  2772.     Write(file,&Prefs,sizeof(struct Preferences));
  2773.     Close(file);
  2774.   }
  2775.   else ShowReq(GetString(msgPrefsSaveError),GetString(msgContinue),filename);
  2776.   WakeWindows();
  2777. }
  2778.  
  2779. void LoadPrefs(void)
  2780. {
  2781. BPTR file;
  2782.  
  2783.   if ((file = Open("ENV:"NAME".prefs",MODE_OLDFILE)) == 0)
  2784.     file = Open("PROGDIR:"NAME".prefs",MODE_OLDFILE);
  2785.   if (file)
  2786.   {
  2787.     Read(file,&Prefs,sizeof(struct Preferences));
  2788.     Close(file);
  2789.     if (Prefs.Version >= 1)
  2790.     {
  2791.       CustomScreen = (Prefs.Flags & PREFS_CUSTOMSCREEN) ? TRUE : FALSE;
  2792.       MaxWindow = (Prefs.Flags & PREFS_MAXWINDOW) ? TRUE : FALSE;
  2793.       ConfirmQuit = (Prefs.Flags & PREFS_CONFIRMQUIT) ? TRUE : FALSE;
  2794.       ShowBLine = (Prefs.Flags & PREFS_SHOWBASELINE) ? TRUE : FALSE;
  2795.       AutoHeight = (Prefs.Flags & PREFS_AUTOTBARHEIGHT) ? TRUE : FALSE;
  2796.       InvertShift = (Prefs.Flags & PREFS_INVERTSHIFT) ? TRUE : FALSE;
  2797.       PixelBorder = 0;
  2798.       if (Prefs.Flags & PREFS_PIXELBORDER) PixelBorder = 1;
  2799.       if (Prefs.Flags & PREFS_PIXELGRID) PixelBorder = 2;
  2800.     }
  2801.     Prefs.Version = CURRENT_PREFS;
  2802.   }
  2803. }
  2804.  
  2805. void CopyChar(struct CharNode *node)
  2806. {
  2807. struct Character *chr;
  2808.  
  2809.   chr = node->chln_Character;
  2810.   if ((chr->chr_Width > 0) && (chr->chr_Data))
  2811.   {
  2812.     if (ClipChar.chr_Data) FreeVec(ClipChar.chr_Data);
  2813.     ClipChar.chr_Data = NULL;
  2814.     ClipChar.chr_Width = chr->chr_Width;
  2815.     ClipChar.chr_Height = chr->chr_Height;
  2816.     if ((ClipChar.chr_Data = AllocVec(chr->chr_Width*chr->chr_Height,
  2817.       MEMF_CLEAR)) == NULL) ErrorCode(ALLOCVEC);
  2818.     CopyMem(chr->chr_Data,ClipChar.chr_Data,chr->chr_Width*chr->chr_Height);
  2819.   }
  2820. }
  2821.  
  2822. void PasteChar(struct CharNode *node)
  2823. {
  2824. struct Character *chr;
  2825. ULONG i;
  2826.  
  2827.   chr = node->chln_Character;
  2828.   if (ClipChar.chr_Data)
  2829.   {
  2830.     if (chr->chr_Data) FreeVec(chr->chr_Data);
  2831.     chr->chr_Data = NULL;
  2832.     if (Proportional) chr->chr_Width = ClipChar.chr_Width;
  2833.     if (chr->chr_Width > 0)
  2834.     {
  2835.       if ((chr->chr_Data = AllocVec(chr->chr_Width*chr->chr_Height,
  2836.     MEMF_CLEAR)) == NULL) ErrorCode(ALLOCVEC);
  2837.       for (i = 0; i < MIN(chr->chr_Height,ClipChar.chr_Height); i++)
  2838.     CopyMem(ClipChar.chr_Data+(i*ClipChar.chr_Width),
  2839.     chr->chr_Data+(i*chr->chr_Width),
  2840.     MIN(chr->chr_Width,ClipChar.chr_Width));
  2841.     }
  2842.     RedrawEdit(node);
  2843.   }
  2844. }
  2845.  
  2846. void FlushAllFonts(void)
  2847. {
  2848. UBYTE *free;
  2849.  
  2850.   if ((free = AllocMem(~0,MEMF_ANY)) != NULL) FreeMem(free,~0);
  2851. }
  2852.  
  2853. void GetScreenRatio(struct Screen *scr)
  2854. {
  2855. struct TagItem vti[] =
  2856.   { VTAG_VIEWPORTEXTRA_GET,NULL,
  2857.     VTAG_END_CM,NULL };
  2858. struct ViewPortExtra *vpe;
  2859.  
  2860.   ScaleX = 1000;
  2861.   ScaleY = 1000;
  2862.   ScrWidth = scr->Width;
  2863.   ScrHeight = scr->Height;
  2864.   if (scr->ViewPort.ColorMap)
  2865.   {
  2866.     if (VideoControl(scr->ViewPort.ColorMap,vti) == 0)
  2867.     {
  2868.       vpe = (struct ViewPortExtra *)vti[0].ti_Data;
  2869.       ScrWidth = vpe->DisplayClip.MaxX - vpe->DisplayClip.MinX + 1;
  2870.       ScrHeight = vpe->DisplayClip.MaxY - vpe->DisplayClip.MinY + 1;
  2871.       ScaleX = MAX((ScrWidth*1000)/640,1000);
  2872.       ScaleY = MAX((ScrHeight*1000)/256,1000);
  2873.     }
  2874.   }
  2875. }
  2876.  
  2877. LONG SizeX(LONG x)
  2878. {
  2879.   return ((x*ScaleX)/1000);
  2880. }
  2881.  
  2882. LONG SizeY(LONG y)
  2883. {
  2884.   return ((y*ScaleY)/1000);
  2885. }
  2886.  
  2887. void WriteFont(char *buffer, char *name, UWORD height)
  2888. {
  2889. char *endptr;
  2890.  
  2891.   strcpy(buffer,name);
  2892.   if (endptr = strstr(buffer,".font")) *endptr = 0;
  2893.   sprintf(buffer+strlen(buffer),"/%d",height);
  2894. }
  2895.  
  2896. char *GetPubName(BOOL screen)
  2897. {
  2898.   return (screen ? PrefThisPubName : PrefDefPubName);
  2899. }
  2900.  
  2901. void CopyPubName(void)
  2902. {
  2903. ULONG custom;
  2904. char *name;
  2905.  
  2906.   GetAttr(GA_Selected,CustButton,&custom);
  2907.   GetAttr(STRINGA_TextVal,PubStr,&name);
  2908.   strcpy(custom ? PrefThisPubName : PrefDefPubName,name);
  2909. }
  2910.  
  2911. void WarnVisitors(void)
  2912. {
  2913. struct bguiRequest visitors =
  2914.   { BREQF_FAST_KEYS,NAME,NULL,NULL,POS_TOPLEFT,NULL,0,0,NULL,0 };
  2915.  
  2916.   visitors.br_GadgetFormat = GetString(msgContinue);
  2917.   visitors.br_TextFormat = GetString(msgVisitors);
  2918.   visitors.br_Screen = Screen;
  2919.   BGUI_Request(NULL,&visitors);
  2920. }
  2921.  
  2922. void ResetKerning(void)
  2923. {
  2924. struct CharNode *node;
  2925. int i;
  2926.  
  2927.   if (ShowReq(GetString(msgCheckResetKerning),GetString(msgYesNo)) == 0)
  2928.     return;
  2929.   for (i = 0; i < 257; i++)
  2930.   {
  2931.     SpaceTable[i] = (CharBuffer+i)->chr_Width;
  2932.     KernTable[i] = 0;
  2933.   }
  2934.   node = CharWndList->lh_Head;
  2935.   while (node->chln_Node.ln_Succ)
  2936.   {
  2937.     CheckWidthKern(node->chln_Character);
  2938.     if (node->chln_Character == KernChar)
  2939.       SetGadgetAttrs(KernObj,KernWnd,NULL,
  2940.       STRINGA_LongVal,KernTable[node->chln_Number],TAG_DONE);
  2941.     node = node->chln_Node.ln_Succ;
  2942.   }
  2943.   RedrawAll();
  2944. }
  2945.  
  2946. void CheckQuit(void)
  2947. {
  2948.   if (ConfirmQuit == FALSE) Quit();
  2949.   if (ShowReq(GetString(msgCheckQuit),GetString(msgQuitCancel),
  2950.     DataChanged ? GetString(msgCharsChanged) : (STRPTR)"") == 1) Quit();
  2951. }
  2952.